我有一个包含大量data.frames(d = 100)的列表,每个数据帧包含许多变量(v = 10)。我想重新排列数据,以便我有一个包含10个data.frames(每个100列)的新列表,并从100个原始data.frames中的每个提取相关列。因此,新的data.frame1将有100列,分别是原始data.frames的第一列,新的data.frame2将有100列,分别是原始data.frames,....,n的第二列。重新安排此的最佳方法是什么。预先谢谢你。
答案 0 :(得分:0)
这是一种使用虚拟数据的方式,因为您没有提供输入。
df1 <- df2 <- df3 <- df4 <- df5 <- data.frame(v1 = 1:3, v2 = 4:6)
lst <- mget(ls(pattern = "^df"))
我认为您的列表看起来像上面的lst
。在这里,我们有5个数据帧,每个数据帧有2列,并且我们对其进行了重新排列,从而最终得到2个数据帧的列表,每个数据帧包含5列。
split_idx <- seq_len(unique(lengths(lst))) # in your case, this should give you 1:10
out <- split.default(x = Reduce(cbind, lst), split_idx)
#$`1`
# v1 v1.1 v1.2 v1.3 v1.4
#1 1 1 1 1 1
#2 2 2 2 2 2
#3 3 3 3 3 3
#$`2`
# v2 v2.1 v2.2 v2.3 v2.4
#1 4 4 4 4 4
#2 5 5 5 5 5
#3 6 6 6 6 6
split.default
将列表沿列拆分。
如果我们需要更改每个数据框的名称,我们可以做
out <- lapply(out, function(x) {
names(x) <- paste0(gsub("(v[0-9]+)\\.+", "\\1", names(x)), "_", 1:5)
x
})
out
#$`1`
# v1_1 v1_2 v1_3 v1_4 v1_5
#1 1 1 1 1 1
#2 2 2 2 2 2
#3 3 3 3 3 3
#$`2`
# v2_1 v2_2 v2_3 v2_4 v2_5
#1 4 4 4 4 4
#2 5 5 5 5 5
#3 6 6 6 6 6