加入单独的列表

时间:2017-12-10 16:41:55

标签: r list join

我有两个单独的列表,一个包含个人ID,另一个包含个人的不同属性;在这种情况下,有3种不同的状态“a”,“b”和“c”。两个列表包含4个不同的时间点:“p1”,“p2”,“p3”和“p4”。

#create ID in period 1,2,3,4
id <- list(p1=sample(c(1:5)),
           p2=sample(c(1:6)),
           p3=sample(c(3:6)),
           p4=sample(c(3:8)))
id
$p1
[1] 4 3 1 2 5

$p2
[1] 6 2 5 3 1 4

$p3
[1] 3 6 5 4

$p4
[1] 7 5 8 3 4 6


#create states in period 1,2,3,4
states <- list(p1=sample(c("a","b","c"),5,replace=TRUE),
                  p2=sample(c("a","b","c"),6,replace=TRUE),
                  p3=sample(c("a","b","c"),4,replace=TRUE),
                  p4=sample(c("a","b","c"),6,replace=TRUE))
states
$p1
[1] "a" "c" "a" "b" "c"

$p2
[1] "c" "c" "b" "b" "c" "a"

$p3
[1] "b" "c" "b" "a"

$p4
[1] "a" "b" "b" "b" "c" "b"

向量的排序是正确的,即在ID向量中具有位置3的任何人在该周期中的状态向量中将具有位置3。请注意,不同的时期都有不同的个人ID以及不同的观察数量。现在,我希望在1-4时间段内有效地匹配各个ID,并随时查看各个州。目标是:

ID p1 p2 p3 p4
1  a  c  NA NA
2  b  c  NA NA
3  c  b  b  b
...

我的第一个直觉就是创建4个data.frames并加入它们,然而,这看起来非常低效,并且没有给出有关个人在一段时间内不在场时放置NA的信息。 感谢任何帮助,非常感谢。

1 个答案:

答案 0 :(得分:2)

我们可以melt数据集然后进行重塑

library(reshape2)
library(dplyr)
library(tidyr)
melt(id, value.name = 'id') %>%
    mutate(value2 = melt(states)[,1]) %>%        
    spread(L1, value2)
#  id   p1   p2   p3   p4
#1  1    a    c <NA> <NA>
#2  2    b    c <NA> <NA>
#3  3    c    b    b    b
#4  4    a    a    a    c
#5  5    c    b    b    b
#6  6 <NA>    c    c    b
#7  7 <NA> <NA> <NA>    a
#8  8 <NA> <NA> <NA>    b

数据

id <- list(p1 = c(4, 3, 1, 2, 5), p2 = c(6, 2, 5, 3, 1, 4), 
       p3 = c(3, 6, 5, 4), p4 = c(7, 5, 8, 3, 4, 6))
states = list(p1 = c('a', 'c', 'a', 'b', 'c'), p2 = c('c', 'c', 'b', 'b', 'c', 'a'),
      p3 = c('b', 'c', 'b', 'a'), p4 = c('a', 'b', 'b', 'b', 'c', 'b'))