从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)
另一答案
我们可以将select
与map
一起使用
library(purrr)
library(dplyr)
list_dfs2 <- map(list_dfs, ~ .x %>%
select(-col3))
或没有匿名功能
list_dfs2 <- map(list_dfs, dplyr::select, -col3)
或带有lapply
和subset
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中的多个数据框中删除同一列的主要内容,如果未能解决你的问题,请参考以下文章