后续:R中的匹配因子级别与共享的唯一行名称

时间:2015-05-06 00:21:55

标签: r data.table dplyr

this post的后续行动。我们如何使用dplyr或data.table包将因子级别与共享行名匹配?

library(data.table)

(DT = data.table(a = LETTERS[c(1, 1:3, 8)], b = c(2, 4:7), 
                 c = as.factor(c("bob", "mary", "bob", "george", "alice")), key="a"))

#    a b      c
# 1: A 2    bob
# 2: A 4   mary
# 3: B 5    bob
# 4: C 6 george
# 5: H 7  alice

...并使用@frank的好答案:

uc <- sort(unique(as.character(DT$c)))
( DT[,(uc):=lapply(uc,function(x)ifelse(c==x,b,NA))][,c('b','c'):=NULL] )

返回:

#   a alice bob george mary
# 1 A    NA   2     NA   NA
# 2 A    NA  NA     NA    4
# 3 B    NA   5     NA   NA
# 4 C    NA  NA      6   NA
# 5 H     7  NA     NA   NA

这里的最后一个问题是,我们如何获得以下输出,其中唯一的行名称共享级别值返回空元素保留的NAs?

       alice bob george mary
# 1 A    NA   2      NA    4
# 2 B    NA   5      NA   NA
# 3 C    NA   NA      6   NA
# 4 H     7   NA     NA   NA

2 个答案:

答案 0 :(得分:4)

用tidyr:

library(tidyr)
spread(DT, c, b)

答案 1 :(得分:2)

这是对最后一个问题的答案的改编:

DT[,b:=as.integer(b)] # it's troublesome otherwise

uc <- sort(unique(as.character(DT$c)))
DT[,lapply(setNames(uc,uc),function(x)ifelse(x%in%c,b,NA_integer_)),by=a]

结果:

   a alice bob george mary
1: A    NA   2     NA    2
2: B    NA   5     NA   NA
3: C    NA  NA      6   NA
4: H     7  NA     NA   NA