后续:R 中具有共享唯一行名称的匹配因子水平
Follow-up: Matching factor levels in R with shared unique row names
的后续行动。我们如何使用 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] )
Returns:
# 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
这里的最后一个问题是,我们如何获得以下输出,其中唯一的行名称共享级别值返回 NA,其中保留空元素?
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
使用 tidyr:
library(tidyr)
spread(DT, c, b)
这里是对最后一个问题的答案的改编:
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
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] )
Returns:
# 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
这里的最后一个问题是,我们如何获得以下输出,其中唯一的行名称共享级别值返回 NA,其中保留空元素?
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
使用 tidyr:
library(tidyr)
spread(DT, c, b)
这里是对最后一个问题的答案的改编:
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