从R中的多个数据框中删除同一列

时间:2020-06-09 02:43:16

标签: r lapply

我正在尝试使用以下代码从R中的多个数据帧“ df1”和“ df2”中删除同一列“ col3”,但我不知道如何将lapply函数的结果重新分配给该数据帧。我想念什么?任何帮助将不胜感激。

df1 <- data.frame(col1 = c(1:4), col2 = c("A","B","C","D"), col3 = c("H","I","J","K"))
df2 <- data.frame(col1 = c(11:14), col2 = c("L","M","N","O"), col3 = c("W","X","Y","Z"))
list_dfs <- list(df1,df2)

lapply(list_dfs, function(x) x[!(names(x) %in% c("col3"))])

3 个答案:

答案 0 :(得分:2)

如果要将子集结果分配回原始数据帧,请使用:

创建一个命名列表。
list_dfs <- list(df1 = df1,df2 = df2)
#OR
#list_dfs <- dplyr::lst(df1, df2)

执行子集操作

list_dfs <- lapply(list_dfs, function(x) x[names(x) != "col3"])

使用list2env将结果分配回原始数据帧

list2env(list_dfs, .GlobalEnv)

答案 1 :(得分:1)

我们可以将selectmap一起使用

library(purrr)
library(dplyr)
list_dfs2 <- map(list_dfs, ~ .x %>%
                                select(-col3))

或者没有匿名功能

list_dfs2 <- map(list_dfs, dplyr::select, -col3)

或带有lapplysubset

list_dfs2 <- lapply(list_dfs, subset, select = -col3)
list_dfs2
#[[1]]
#  col1 col2
#1    1    A
#2    2    B
#3    3    C
#4    4    D

#[[2]]
#  col1 col2
#1   11    L
#2   12    M
#3   13    N
#4   14    O

最好将数据集保留在list中,而不要在全局环境中创建多个数据集


我们可以mget创建命名为list并使用list2env更新原始数据集

list2env(lapply(mget(paste0('df', 1:2)), subset, select = -col3), .GlobalEnv)

或者另一个简单的选择是assign,它的循环为for

for(df in paste0('df', 1:2)) assign(df, subset(get(df), select = -col3))
df1
#  col1 col2
#1    1    A
#2    2    B
#3    3    C
#4    4    D

df2
#  col1 col2
#1   11    L
#2   12    M
#3   13    N
#4   14    O

答案 2 :(得分:1)

您的删除列的代码很好-您需要分配结果。 list_dfs <- lapply(...)。在R中,几乎总是,如果您不使用<-=进行分配,则没有任何变化。