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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了从R中的多个数据框中删除同一列相关的知识,希望对你有一定的参考价值。

我正在尝试使用下面的代码从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"))])
答案

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

另一答案

如果要将子集结果分配回原始数据帧,请使用:创建命名列表:

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)
另一答案

我们可以将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
    

以上是关于从R中的多个数据框中删除同一列的主要内容,如果未能解决你的问题,请参考以下文章

r 从包含 2 列组合的副本的数据框中删除行 [重复]

从 R 中的整个数据帧中删除空格

r 从数据框中删除列

如何从 r 中的数据框中删除标题行? [复制]

如何在 R 中合并同一数据框中的行(基于特定列下的重复值)?

从scala中的数据框中删除不需要的列