繁体   English   中英

有没有办法自动将彼此下方的 append 数据框列合并为大型数据框列表中的一列?

[英]Is there a way to automatically append data frame columns below each other into one column within large list of data frames?

我有一个包含数千个数据框的大列表。 这些数据框各有多个列。 因此,我想在这些数据框中的每一个中自动将列绑定到一列中。 这意味着它们被附加在彼此下方,如下所示。 此后,我会将列表转换为一个数据框,由于原始列表中每个元素的列数不同,该数据框的列长度会有所不同。

由此:

y1 y2
1  4
2  5
3  6

对此:

y1
1
2
3
4
5
6

这应该针对列表中的每个元素完成,因此解决方案需要考虑到有数千个不同的数据帧,不能单独提及(示例):

df1 = data.frame(
  X1 = c(1, 2, 3),
  X1.2 = c(4, 5, 6)
)
 df2 = data.frame(
  X2 = c(7, 8, 9),
  X2.2 = c(1, 4, 6)
)
df3 = data.frame(
  X3 = c(3, 4, 1),
  X3.2 = c(8, 3, 5),
  X3.3 = c(3, 1, 9)
)
 
listOfDataframe = list(df1, df2, df3)

最终 output:

df_final = data.frame(
  X1 = c(1, 2, 3, 4, 5, 6),
  X2 = c(7, 8, 9, 1, 4, 6),
  X3 = c(3, 4, 1, 8, 3, 5, 3, 1, 9)
)

这个问题背后的另一个问题是会有不同数量的行,我不知道如何在数据框中考虑,因为列需要具有相同的长度。

预先感谢您的帮助,非常感谢。

R内部列表结构: 列出带有数据框元素的 L

我们可以在使用unlist遍历listlapply

lst1 <- lapply(listOfDataframe, \(x)
   setNames(data.frame(unlist(x, use.names = FALSE)), names(x)[1]))

-输出

lst1
[[1]]
  X1
1  1
2  2
3  3
4  4
5  5
6  6

[[2]]
  X2
1  7
2  8
3  9
4  1
5  4
6  6

[[3]]
  X3
1  3
2  4
3  1
4  8
5  3
6  5
7  3
8  1
9  9

如果我们需要将list转换为单个 data.frame,请使用qPCR中的cbind.na

do.call(qpcR:::cbind.na, lst1)
  X1 X2 X3
1  1  7  3
2  2  8  4
3  3  9  1
4  4  1  8
5  5  4  3
6  6  6  5
7 NA NA  3
8 NA NA  1
9 NA NA  9

这是一个 tidyverse 解决方案:

library(dplyr)
library(purrr)
listOfDataframe %>% 
  map(~.x %>% stack(.)) %>% 
  map(~.x %>% select(-ind))
[[1]]
  values
1      1
2      2
3      3
4      4
5      5
6      6

[[2]]
  values
1      7
2      8
3      9
4      1
5      4
6      6

[[3]]
  values
1      3
2      4
3      1
4      8
5      3
6      5
7      3
8      1
9      9

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM