我有一个数据帧(D)和一个数据帧列表(L),我希望将它组合成一个新的数据帧。对于L中的每个数据帧,D中有一行,我想将这些数据连接在一起,以便D中的每一行与L中的相应数据帧匹配,并在每行中复制。 L中的数据帧具有不同的行号,但它们都具有相同的列并且可以容易地组合成单个数据帧(例如,使用plyr::rbind.fill
)。 D与L中的数据框之间没有共同的变量 - 我知道哪些行组合在一起的唯一方法是它们在D和L中出现的顺序。
以下是与我的数据具有相同结构的玩具数据:
# the data frame
D <- data.frame(name = c("john","sally","ben"), age = c(23, 31, 27))
# the list of data frames
john <- data.frame(attempt = 1:3, result = c("fail","fail","fail"))
sally <- data.frame(attempt = 1, result = c("success"))
ben <- data.frame(attempt = 1:5, result = c("fail","fail","success","fail","success"))
L <- list(john, sally, ben)
我尝试这样做的愚蠢方法是使用for
循环:
# loop to combine data frame and list
new_D <- data.frame()
for (i in 1:nrow(D)) {
add <- cbind(D[i,], L[[i]])
new_D <- rbind(new_D, add)
}
它可以工作,但它非常慢,我的文件非常大,所以它不实用。什么是更简洁,更有效的方法在R?
答案 0 :(得分:4)
命名列表元素,将列表转换为带有索引列的单个return moveVector.sub(subvec);
(&#34;名称&#34;),与&#34; name&#34;上的原始数据连接。柱:
data.table
答案 1 :(得分:2)
我们可以按行序列split
,然后使用Map
cbind
数据集
do.call(rbind, Map(cbind, split(D, seq_len(nrow(D))), L))
或者设置&#39; L&#39;使用paste
行&#39; D&#39;,将行和separate
绑定到两列
library(tidyverse)
do.call(paste, c(D, sep = ",")) %>%
set_names(L, .) %>%
bind_rows(.id = 'grp') %>%
separate(grp, into = c('name', 'age'))