合并/组合列表中单独数据框或对象的特定列

时间:2016-01-18 02:54:25

标签: r merge sapply cbind

我一直在寻找一种解决方案,可以有效地将来自不同数据框的特定列或同一列表中的单独对象组合成新的数据帧。我有5个数据框,它们都有相同的行名(例如x,y,z)和相同的列名(V1,V2,V3,... V1000)。

   V1   V2   V3   V4...      V1    V2   V3   V4...
x   1    5    8    9      x   2     7    9    5
y   2    7    4    8      y   4     6    5    6
z   4    4    5    9      z   3     4    8    7

我需要做的是从所有五个帧中提取V1并使用这五个V1列创建一个新的数据帧,然后对剩余的V2-V1000执行相同的操作,以获得类似的内容:

   V1   V1   V1   V1   V1         V2    V2   V2   V2   V2
x   1    5    8    9    5      x   2     7    9    5    5
y   2    7    4    8    8      y   4     6    5    6    4
z   4    4    5    9    7      z   3     4    8    7    7

最后,我需要对所有1000个新创建的数据帧应用另一个函数,因此如果有办法循环这个合并过程并将1000个新帧放入一组新的帧中,那将是理想的。 / p>

我尝试过各种形式的合并,cbind,sapply以及我在网上和其他地方建议的其他解决方案。我能想到的最好的方法是将所有五个数据帧放到一个列表中,然后使用sapply从每个对象合并V1 sapply(y,“[[”,2)其中y是列表,2对应于每个对象中的V1列。但是,我似乎无法得到这个循环。我可以使用此代码手动创建1000个新数据框,但这需要永远。

对其他可能有用的答案的任何建议或指示都将不胜感激!

1 个答案:

答案 0 :(得分:2)

我们可以遍历列名并从' data.frame&和cbind中提取列。

nm1 <- paste0("V", 1:1000)
lst <- lapply(nm1, function(x) 
           cbind(df1[x], df2[x], df3[x], df4[x], df5[x]))

输出为list data.frames。最好将它们保留为list,而不是在全局环境中创建单独的对象。但如果我们需要,

 list2env(setNames(lst, paste0("df_new", seq_along(lst))),
               envir = .GlobalEnv)

数据

set.seed(24)
df1 <- as.data.frame(matrix(sample(0:10, 3*1000, 
 replace=TRUE), ncol=1000, dimnames=list(c('x', 'y', 'z'), 
  paste0("V", 1:1000))) )
df2 <- as.data.frame(matrix(sample(0:10, 3*1000, 
 replace=TRUE), ncol=1000, dimnames=list(c('x', 'y', 'z'),
     paste0("V", 1:1000))) )
df3 <- as.data.frame(matrix(sample(0:10, 3*1000,
   replace=TRUE), ncol=1000, dimnames=list(c('x', 'y', 'z'), 
   paste0("V", 1:1000))) )
df4 <- as.data.frame(matrix(sample(0:10, 3*1000, 
   replace=TRUE), ncol=1000, dimnames=list(c('x', 'y', 'z'),
   paste0("V", 1:1000))) )

 df5 <- as.data.frame(matrix(sample(0:10, 3*1000, 
    replace=TRUE), ncol=1000, dimnames=list(c('x', 'y', 'z'), 
   paste0("V", 1:1000))) )