结合data.frame和在R中没有公共变量的data.frames列表

时间:2018-05-26 15:38:46

标签: r data-manipulation

我有一个数据帧(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?

2 个答案:

答案 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'))