【问题标题】:lapply set of functions across multiple dataframeslapply 跨多个数据帧的函数集
【发布时间】:2019-07-08 12:03:31
【问题描述】:

我有一组函数需要应用于多个数据帧。我想使用 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),]

当我尝试 (l) 将此函数应用于多个数据帧时,调用数据帧时似乎没有任何变化。直觉上我认为我在调用 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]]

【问题讨论】:

  • 请通过添加示例数据使您的示例更具重现性。
  • lapply 适用于矢量,而不适用于列表,即使参数被称为“列表”..也许您可以尝试使用矢量..如果您无法制作数据帧矢量,您必须使用字符串向量(您的 df 的名称),然后在函数中使用 eval 进行一些更改。此外,在函数内部,您可以更改全局对象并不明显,因此请尝试使用 "
  • @MrSmithGoesToWashington Lists are 向量在 R 中。lapply 与列表一起工作得很好。而且&lt;&lt;-在这里也不合适。
  • @KonradRudolph:是的,你当然是对的 .. 你能解释更多关于“
  • @MrSmithGoesToWashington &lt;&lt;- 在父环境中执行赋值,但 OP 不希望这样做(它会在全局环境中创建并反复覆盖一个名为 df 的变量)。跨度>

标签: r lapply


【解决方案1】:

您的代码可能按预期工作,但您将其结果分配给 df.list,而不是原始 data.frames。该列表包含其中的副本,因此它们永远不会被修改。这是有意的,也是 R 中的期望行为。

事实上,只需继续使用您的 data.frames 列表即可。

【讨论】:

    【解决方案2】:

    这个例子做了你想做的事:

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

    【讨论】:

    • 谢谢 Wietze314。我已经更正了电子邮件变量,它应该是 attribute_2。我已经尝试过你的建议,它似乎奏效了!一个后续问题:我想使用新列表 (df.list2) 中的数据集进行进一步分析。但是当我调用例如 df2 时,我得到了旧的数据框。而当我调用 df.list2[[3]] 时,我得到的数据帧没有重复,并且有序。我现在如何使用这个新列表中的数据框?
    • 如你所说,在另一个 lapply 函数中使用它们或使用df.list[[1]] 调用它们,例如numberofrows &lt;- nrow(df.list[[1]])
    猜你喜欢
    • 2020-09-11
    • 2020-02-18
    • 1970-01-01
    • 2017-07-11
    • 1970-01-01
    • 2020-02-18
    • 2019-09-08
    • 2019-05-20
    • 1970-01-01
    相关资源
    最近更新 更多