我有数据帧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的定义以使其可重现。
答案 0 :(得分:4)
有关R的一点要注意的是,就assignment而言,<-
是可传递的,而=
则不是。A$x <- B$x <- C$x <- factor( C$x, levels=c('z','y','x') )
。因此,如果您的数据框在这方面都是相同的,那么您应该能够做到这样的事情:
{{1}}
答案 1 :(得分: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]])
}