2017-02-11 58 views
1

我试图从多个(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) 
) 

我写了一个函数(下)要做到这一点,这对个人dataframes工作:

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

我认为这是因为我的函数试图对我的列表中的项目起作用,而不是我列表中的项目名称所代表的数据框,但我无法弄清楚如何改变它。

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

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

回答

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 
+0

谢谢,但是因为我的数据框都有不同的名称(例如不只是df1,df2,df3等)/有很多它们,我不能像'list(df1,df2,df3)那样手动创建一个列表' 。 – cstaff91

+0

其实,解决它使用[这个答案](http://stackoverflow.com/questions/14954399/put-multiple-data-frames-into-list-smart-way) – cstaff91

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中,但我们也可以更新全局环境中的原始对象^ h list2env(不推荐虽然)

​​
+0

,是因为我的在我的实际数据集都被命名为不同的,我有使用[这个答案](http://stackoverflow.com/questions/14954399/put-multiple-data-frames-into-list-smart-way),但这将很好地工作,谢谢。 – cstaff91