【问题标题】:How to loop through and modify multiple data frames in R如何在R中循环和修改多个数据帧
【发布时间】:2013-11-13 08:24:49
【问题描述】:

我有数据框 A, B, C, ... 并且想以相同的方式修改每个数据框,例如重新排序所有数据帧中存在的因子的因子水平:

A = data.frame( x=c('x','x','y','y','z','z') )
B = data.frame( x=c('x','y','z') )
C = data.frame( x=c('x','x','x','y','y','y','z','z','z') )

A$x = factor( A$x, levels=c('z','y','x') )
B$x = factor( B$x, levels=c('z','y','x') )
C$x = factor( C$x, levels=c('z','y','x') )

如果有大量数据框和/或需要进行大量修改,这将变得很费力。我怎样才能简洁地做到这一点,使用循环或更好的东西?一种简单的方法,例如

for ( D in list( A, B, C ) ) {
D$x = factor( D$x, levels=c('z','y','x') )
}

不起作用,因为它不会修改原始数据帧。

编辑:添加了 A、B 和 C 的定义以使其可重现。

【问题讨论】:

  • 你能提供reproducible example吗?
  • 已添加 A、B 和 C 的定义,以便您可以运行代码。
  • 谢谢。我知道这会很烦人,尤其是在情况很明显的时候,但这是一种很好的做法,可以让我们的生活更轻松:)

标签: r loops dataframe


【解决方案1】:

关于 R 需要注意的一点是,对于 assignment<- 是可传递的,而 = 不是。因此,如果您的数据框在这方面都是相同的,您应该能够执行以下操作:

A$x <- B$x <- C$x <- factor( C$x, levels=c('z','y','x') )

【讨论】:

  • 感谢您的回复。不幸的是,它不适用于我的情况(我认为),因为数据框都有不同的行数。我将修改我的示例以明确这一点。
  • 这就是为什么需要可重现的例子。
【解决方案2】:

如果你不需要显式循环,你可以使用 lapply:

ll <- lapply(
    list(A, B, C),
    function(df) {
        df$x <- factor(df$x, levels=c('z', 'y', 'x'))
        return(df)
    }
)

由于只复制数据,因此您必须使用从 lapply 返回的列表。

编辑

dfs <- list('A', 'B', 'C')
levels <- c('z', 'y', 'x')

l <- lapply(
    dfs,
    function(df) {
        # Get data frame by name
        df <- get(df)
        df$x <- factor(df$x, levels=levels)
        return(df)
    }
)


for ( i in 1:length(dfs)) {
    assign(dfs[[i]], l[[i]])
}

【讨论】:

  • 如果您不输入return(df),您将无法取回数据框元素。
  • 这没关系,但我想要一种修改原始数据框的方法,或者更准确地说,我想继续使用原始名称来引用它们。有没有一种简单的方法可以使用此解决方案的输出来获得该结果?
  • 我发布了一个带有示例解决方案的编辑,但我不能说我喜欢它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-03-21
  • 2020-05-25
  • 1970-01-01
  • 2013-07-12
  • 1970-01-01
  • 2021-12-25
相关资源
最近更新 更多