如何轻松操作列表中的data.frame让它们具有相同的模式?

时间:2016-11-10 15:29:36

标签: r dataframe

我实现了返回data.frame列表的函数,其中data.frame中索引向量的顺序不同。但是,我打算操纵这个列表,让第二个,第三个data.frame与列表中的第一个data.frame具有相同的模式。因为结果在列表中,所以我想轻松操作这个列表让data.frame对象具有相同的模式。我怎样才能轻松实现这一目标?有谁知道轻松操纵列表的任何有用技巧?提前谢谢。

我的自定义函数的输出是:

dfList <- list(
  df_1 = data.frame(hola = c(1,2,3), ciao=c(NA,1,2), bonjour=c(1,1,2)),
  df_2 = data.frame(ciao = c(1,2,3), hola=c(2,3,NA), bonjour=c(1,2,4)),
  df_3 = data.frame(bonjour = c(1,2,3,4), hola=c(2,3,NA,NA), ciao=c(1,2,NA,3))
)

我打算制作第二个,第三个data.frame与列表中的第一个data.frame具有相同的模式。如何轻松操作data.frame在列表中具有相同的模式?

期望的输出可能是:

$df_1
    hola ciao bonjour
1    1   NA       1
2    2    1       1
3    3    2       2

$df_2
    hola ciao bonjour
1    2    1       1
2    3    2       2
3    NA   3       4

$df_3
    hola ciao  bonjour 
1   2    1      1
2   3    2      2
3   NA   NA     3
4   NA   3      4

我知道如果data.frame不在列表中会更容易,所以只需使用names()让它们具有相同的模式。但重点是列表中的data.frame现在作为输出,所以我打算很好地操作这个列表而不是访问每个data.frame三次并使用names()函数。我怎样才能做到这一点?如何实现我想要的输出?我怎样才能获得更多动态解决方案呢?非常感谢:)

2 个答案:

答案 0 :(得分:5)

我们可以使用

lapply(dfList, function(x) x[names(dfList[[1]])])

答案 1 :(得分:4)

只需按照与第一个数据框相同的顺序重新选择所有数据框的列:

lapply(dfList, `[`, names(dfList[[1]]))

#$df_1
#  hola ciao bonjour
#1    1   NA       1
#2    2    1       1
#3    3    2       2

#$df_2
#  hola ciao bonjour
#1    2    1       1
#2    3    2       2
#3   NA    3       4

#$df_3
#  hola ciao bonjour
#1    2    1       1
#2    3    2       2
#3   NA   NA       3
#4   NA    3       4
相关问题