Merging/combining 来自单独数据框或列表中对象的特定列

Merging/combining specific columns from separate data frames or objects within a list

我一直在徒劳地寻找解决方案,以有效地将来自不同数据框或同一列表中不同对象的特定列组合到新数据框中。我有 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 个新帧放入一组新的帧中,那将是理想的.

我已经尝试过各种形式的合并、cbind、sapply 和我在此处和网络上其他地方发现的其他解决方案。我能想到的最好的方法是将所有五个数据帧放入一个列表中,然后使用 sapply 从每个对象合并 V1 使用 sapply(y, "[[",2) 其中 y 是列表,2 对应于每个对象中的 V1 列。但是,我似乎无法循环播放。我可以使用此代码手动创建 1000 个新数据框,但这需要很长时间。

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

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

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

输出是 data.frameslist。最好将它们保留为 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))) )