根据R中其他列的存在,将列添加到列表中的 Dataframe

lsmd5eda  于 2023-01-28  发布在  其他
关注(0)|答案(3)|浏览(179)

我正尝试根据 Dataframe 中列的存在情况,向列表(包含~200个 Dataframe 的长列表)中的所有 Dataframe 添加一个新列。以iris数据集的修改和未修改版本为例,我正尝试为每个 Dataframe 添加一个名为“species_fixed”的新列。我尝试遵循的规则是:
1.如果列“Species”存在于 Dataframe 中,则为新列“species_fixed”添加来自该Species列的信息.
1.如果列“sp”存在于 Dataframe 中,则为新列“species_fixed”添加来自该sp列的信息。
1.如果这两个列名都不存在,则创建一个全部为NA的species_fixed列。
以下是我的尝试:

library(dplyr)

#Making a couple dataframes with various structures:

iris_1 <- iris %>% rename(sp = Species)
iris_2 <- iris %>% select(Sepal.Length, Sepal.Width)
iris_3 <- iris %>% mutate(species_2  = Species)

#Making them into a list:

iris_list <- list(iris, iris_1, iris_2, iris_3)

#Attempting to use lapply:

iris_list_fixed <- lapply(iris_list, function(q){
  species_fixed = mutate(ifelse('Species' %in% names(q), Species, ifelse(
'sp' %in% names(q), sp, "NA"))
})

我想这一定需要lapply()、mutate()、ifelse()和其他可能的函数的某种组合,但我似乎不能完全实现它。

bkhjykvo

bkhjykvo1#

下面是一个使用您自己的示例的工作示例:

library(dplyr)

#Making a couple dataframes with various structures:

iris_1 <- iris %>% rename(sp = Species)
iris_2 <- iris %>% select(Sepal.Length, Sepal.Width)
iris_3 <- iris %>% mutate(species_2  = Species)

#Making them into a list:

iris_list <- list(iris, iris_1, iris_2, iris_3)

#Attempting to use lapply:

iris_list_fixed  <- lapply(iris_list, function(df){
  df <- df %>%
    rowwise() %>%
    mutate(species_fixed  = ifelse('Species' %in% names(df), as.character(Species), 
                                    ifelse('sp' %in% names(df), as.character(sp), "NA")
                                   )
           )
})
gupuwyp2

gupuwyp22#

大体上类似于另一个答案,但定义一个命名函数并直接分配一个新列(在对mutate的调用之外)可能更简洁:

library(dplyr)

add_fixed <- function(df) {
  if ("Species" %in% names(df)) df$species_fixed <- df$Species
  else if ("sp" %in% names(df)) df$species_fixed <- df$sp
  else df$species_fixed <- NA_character_
  
  df
}

iris_species_fixed <- lapply(iris_list, add_fixed)
643ylb08

643ylb083#

我想知道您是否可以使用%||%中缀。如果第一个值(列名)不存在,请尝试第二个值,如果不存在,则使用NA

library(purrr)

map(
  iris_list,
  \(x) {
    x$species_fixed <- x$Species %||% x$sp %||% NA
    x
  } 
)

相关问题