我有两个单独的列表,一个包含个人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的信息。 感谢任何帮助,非常感谢。
答案 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'))