跨多个数据框应用一组功能

时间:2019-02-14 12:47:39

标签: r lapply

我有一套需要应用于多个数据框的功能。我想使用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]]

2 个答案:

答案 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]]