从多个数据框中删除/操作行

时间:2017-02-11 12:40:26

标签: r dataframe

我正在尝试从多个(28)数据帧中删除相同数量的行,每个数据帧的长度各不相同。这是一个玩具数据集来说明我的意思:

df1 <- data.frame(
  var1 = c(1,2,3,4,5),
  var2 = c(2,4,6,8,10)
)

df2 <- data.frame(
  var3 = c(1,2,3,4,5,6,7),
  var4 = c(2,4,6,8,10,12,14)
)

df3 <- data.frame(
  var5 = c(1,2,3,4,5,6,7,8,9,10),
  var6 = c(2,4,6,8,10,12,14,16,18,20)
)

我已经编写了一个函数(如下所示),它可以处理单个数据帧:

remove_rows <- function(x){
  x[c(3:nrow(x)),]
}

然后,我使用df_list <- ls()创建了一个数据框列表,并尝试使用lapply(df_list, function(x) remove_rows(x))在列表中的每个项目上运行该功能,但我一直收到此错误:Error in 3:nrow(x) : argument of length 0

我认为这是因为我的功能是尝试对列表中的项目进行操作,而不是列表中项目名称所代表的数据框架,但我无法确定如何更改它。“ / p>

我也尝试了for循环(下面)的hacky方法,但也失败了。

for (i in 1:length(df_list)){
  name <- df_list[i]
  assign(name, remove_rows(df_list[i]))
}

2 个答案:

答案 0 :(得分:1)

我们可以使用mget获取list中对象的值,然后应用remove_rows函数

df_list <- lapply(mget(paste0("df", 1:3)), remove_rows)

ls

df_list <- lapply(mget(ls(pattern = "df\\d+")), remove_rows) 
df_list
#$df1
#  var1 var2
#3    3    6
#4    4    8
#5    5   10

#$df2
#  var3 var4
#3    3    6
#4    4    8
#5    5   10
#6    6   12
#7    7   14

#$df3
#   var5 var6
#3     3    6
#4     4    8
#5     5   10
#6     6   12
#7     7   14
#8     8   16
#9     9   18
#10   10   20

注意:最好在list中保留多个数据集,但我们也可以使用list2env更新全局环境中的原始对象(不推荐)

list2env(df_list, .GlobalEnv)

答案 1 :(得分:1)

在列表中的每个数据框中使用listlapply函数:

> df_list <- list(df1, df2, df3)
> new_df_list <- lapply(df_list, remove_rows)
> new_df_list
[[1]]
  var1 var2
3    3    6
4    4    8
5    5   10

[[2]]
  var3 var4
3    3    6
4    4    8
5    5   10
6    6   12
7    7   14

[[3]]
   var5 var6
3     3    6
4     4    8
5     5   10
6     6   12
7     7   14
8     8   16
9     9   18
10   10   20