使用 R 将列表的元素与数据框匹配
Matching elements of a list to a data frame using R
df是包含ids的数据框,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
我们可以使用lengths
(在R 3.2.0
中引入)得到'list'的每个元素的length
,复制'df$id',unlist
'list' 并用这些向量创建一个 '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
或者我们可以使用数据集 ('df') 的 'id' 列设置 'list' 的名称,并使用 stack
获得长格式
stack(setNames(list, df$id))
或与 unnest
来自 tidyr
的类似方法
library(tidyr)
unnest(setNames(list, df$id), id)
注意:最好不要用函数名来命名对象(参考'list'、'df')
df是包含ids的数据框,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
我们可以使用lengths
(在R 3.2.0
中引入)得到'list'的每个元素的length
,复制'df$id',unlist
'list' 并用这些向量创建一个 '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
或者我们可以使用数据集 ('df') 的 'id' 列设置 'list' 的名称,并使用 stack
获得长格式
stack(setNames(list, df$id))
或与 unnest
来自 tidyr
library(tidyr)
unnest(setNames(list, df$id), id)
注意:最好不要用函数名来命名对象(参考'list'、'df')