【问题标题】:Follow-up: Matching factor levels in R with shared unique row names跟进:将 R 中的因子级别与共享的唯一行名匹配
【发布时间】:2015-05-06 00:21:55
【问题描述】:

跟进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

这里的最后一个问题是,我们如何获得以下输出,其中唯一的行名称共享级别值,返回空元素保留的 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

【问题讨论】:

  • 如果你一直想要这个结果,你可以在你的另一个问题中预先要求它 - spread 是为此而构建的,但是你得到的答案假设你想要额外的行...
  • 如果你曾经看到A,2,bobA,3,bob 的观察结果,你会遇到麻烦。您的数据是否以列 ab 为键(每个组合最多出现一次)?
  • @Sam-Firke 这是我直观的目标,但在我遗漏了大部分内容之后才注意到。如果您将此作为结果添加到您的其他回复中,我会投赞成票!
  • @Frank 不确定“a 和 b 是键”是什么意思。我正在寻求的答案与任意(即,>= 1 个每个级别的实例来创建唯一列)有关
  • 哦,抱歉,我的意思是您是否有可能对A,2,bobA,3,bob 进行观察?如果是这样,则新生成的列中的值对于结果中的行 Abob 是不确定的。

标签: r data.table dplyr


【解决方案1】:

使用 tidyr:

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

【讨论】:

  • 使用 data.tabledplyr
  • @BobHopez 如果你对 dplyr 感兴趣,我的理解是 tidyr 是为了配合它。
  • 您可以将 tidyr 视为 dplyr 表亲。它们旨在串联使用。
【解决方案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

【讨论】:

  • 感谢您的额外支持!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
相关资源
最近更新 更多