我有一套需要应用于多个数据框的功能。我想使用lapply函数代替for()循环。
#sample data frame
id lastpage attribute_2
1 20 232
2 8 232
3 6 129
4 20 1271
5 20 129
6 20 74
当我一次将其应用于一个数据框时,这些功能起作用。基本上,它会删除变量“ lastpage”具有最低值的重复项(基于attribute_2):
df <- df[order(df$attribute_2, -df$lastpage),]
df <- df[!duplicated(df$attribute_2),]
当我尝试将此函数应用于多个数据框时,调用该数据框时似乎什么都没有改变。凭直觉,我认为我在打df时弄乱了一些东西,但我不确定是什么:
df.list <- list(df0, df1, df2, df3)
myFunc <- function(df) {
df <- df[order(df$attribute_2, -df$lastpage),]
df <- df[!duplicated(df$attribute_2),]
return(df)
}
df.list <- lapply(df.list, FUN = myFunc)
非常感谢您的帮助! 我已经看过所有关于lapply函数的类似问题,特别是以下问题:Applying a set of operations across several data frames in r 我可能犯了一个非常明显的错误,但我找不到它。
编辑:谢谢大家的帮助 对于想知道我现在到底使用什么代码的人:
df.list <- list(df0, df1, df2, df3)
myFunc <- function(x) {
x <- x[order(x$attribute_2, -x$lastpage),]
x <- x[!duplicated(x$attribute_2),]
}
df.list2 <- lapply(df.list, myFunc)
df2_c<-df.list2[[3]]
答案 0 :(得分:1)
您的代码可能会按预期工作,但您要将其结果分配给df.list
,而不是原始data.frames。该列表包含这些副本的副本,因此它们永远不会被修改。这是有意的,是R中的预期行为。
实际上,只需继续处理data.frames列表即可。
答案 1 :(得分:0)
此示例完成了您打算做的事情
set.seed(314)
df <- data.frame(x = sample(1:10, size = 50, replace = TRUE),
y = sample(1:10, size = 50, replace = TRUE))
df.list <- list(df,df,df,df)
lapply(df.list,nrow)
testfunction <- function(data){
data[!duplicated(data$x),]
}
lapply(df.list, testfunction)
我认为您的功能有问题。我注意到您引用的列email
不在您的数据框中。
建议重命名该函数内部使用的变量,因此不要引用全局变量。
正如Konrad在另一个答案中所说,您的原始数据帧保持不变,因此,请按如下所示对其进行调用:
df.list2 <- lapply(df.list, testfunction)
df.list2[[1]]