使用R将列表的元素匹配到数据框

时间:2015-06-10 16:59:17

标签: r list dataframe match

df 是包含ID的数据框, list 是属性列表。 list 的第一个元素包含第一次观察 df 的属性,依此类推。

如何获取与具有属性的ID匹配的数据框?

一个例子

set.seed(1)
df= data.frame(id=paste(rep("id",10),1:10,sep=""))
list=replicate(10,letters[sample(1:26,sample(1:3,1),replace=T)])

head(df)
# id 
# id1
# id2
# id3
# id4
# id5


head(list)
[[1]]
[1] "j"

[[2]]
[1] "x" "f"

[[3]]
[1] "y" "r" "q"

[[4]]
[1] "f"

[[5]]
[1] "r"

[[6]]
[1] "u" "m"

结果数据框的前5个观察结果应如下所示

   id attribute
1 id1         j
2 id2         x
3 id2         f
4 id3         y
5 id3         r

1 个答案:

答案 0 :(得分:3)

我们可以使用length(在lengths中引入)获取'list'的每个元素的R 3.2.0,复制'df $ id',unlist'列出'并用这些向量创建'data.frame'。

 res <- data.frame(id=rep(df$id,lengths(list)), attribute=unlist(list))
 head(res)
 #     id attribute
 #  1 id1         j
 #  2 id2         x
 #  3 id2         f
 #  4 id3         y
 #  5 id3         r
 #  6 id3         q

或者我们可以使用数据集的“id”列('df')设置'list'的名称,并使用stack获取长格式

  stack(setNames(list, df$id))

或来自unnest

tidyr的类似方法
  library(tidyr)
  unnest(setNames(list, df$id), id)

注意:最好不要使用函数名称命名对象(参考'list','df')