我正在尝试从多个(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]))
}
答案 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)
在列表中的每个数据框中使用list
和lapply
函数:
> 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