如何在R中循环遍历并修改多个数据框

5

我有数据框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的定义以便复现。


1
你能提供一个可重现的例子吗? - zero323
已添加A、B和C的定义,以便您可以运行代码。 - baixiwei
1
谢谢。我知道这可能很烦人,特别是当情况显而易见时,但这是一个好习惯,可以让我们的生活更轻松 :) - zero323
2个回答

4

需要注意的是,在R中,关于赋值<-是可传递的,而=则不是。因此,如果您的数据框在这方面都是相同的,您应该能够像这样做:

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

谢谢回复。不幸的是,对于我的情况它不起作用(我认为),因为数据框的行数都不同。我会修改我的示例以使其更清晰。 - baixiwei
1
这就是为什么需要提供可复现的示例。 - gung - Reinstate Monica

3

如果您不需要显式的循环,可以使用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),您将无法获取数据框的元素。 - IRTFM
这样做没问题,但我想要一种修改原始数据框的方法,更确切地说,我想要继续通过它们的原始名称进行引用。是否有一种简单的方法可以使用此解决方案的输出来实现这个结果? - baixiwei
我已经发布了一个带有示例解决方案的编辑,但我不能说我喜欢它。 - zero323

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接