【问题标题】:data.table (R) paste value from a specific row while aggregating by groupdata.table (R) 从特定行粘贴值,同时按组聚合
【发布时间】:2018-06-11 12:30:45
【问题描述】:

我正在处理一个古怪的问题。 我有一些这样的数据:

dt<-data.table(time = c('13:00','13:00','13:00','13:15','13:15'),group=c('A','A','B','A','B'),code=c('11b','16b','22c','9c','7y'))

        time group code
    1: 13:00     A  11b
    2: 13:00     A  16b
    3: 13:00     B  22c
    4: 13:15     A   9c
    5: 13:15     B   7y

我正在尝试执行以下操作。创建一个新列 (:= Fgroup),它的值以 group 为条件,并由 time 聚合。 因此,如果group == A,将值粘贴到code 中就足够了。如果group == B,我需要通过time 粘贴A 组的代码(或代码,如果有很多)。

换句话说:

        time group code Fcode
    1: 13:00     A  11b  11b
    2: 13:00     A  16b  16b
    3: 13:00     B  22c  11b,16b
    4: 13:15     A   9c  9c
    5: 13:15     B   7y  9c

有什么简单的方法吗? 谢谢

【问题讨论】:

  • 只有A组或B组吗?
  • B 组每次只有一行?
  • 还有一个组 C,但适用于组 A 的规则相同(只需粘贴相同的值)。 B组按时间可以有更多行。
  • 您如何决定组的层次结构?为什么不检查从 B 组到 A 组的时间是否重叠? C组是否应该与A组和B组都进行比较?你的问题不是很清楚。
  • 我没有说逻辑看起来很奇怪。我问了一个具体的问题:您如何确定组的层次结构?以及如何处理 B 之后的组。换句话说,A

标签: r data.table aggregate


【解决方案1】:

你的意思是有这样的东西吗?

library(data.table)

dt[, Fcode := paste(code[group == 'A'], collapse = ","), by = time][group == 'A', Fcode := code]

给了

> dt
    time group code   Fcode
1: 13:00     A  11b     11b
2: 13:00     A  16b     16b
3: 13:00     B  22c 11b,16b
4: 13:15     A   9c      9c
5: 13:15     B   7y      9c


样本数据:

dt <- data.table(time = c('13:00','13:00','13:00','13:15','13:15'),
                 group= c('A','A','B','A','B'),
                 code = c('11b','16b','22c','9c','7y'))

【讨论】:

  • 这也是非常手动的,不会扩展到超过两个组。或其他名称的组。
【解决方案2】:

单独按时间分组,添加一个包含所有粘贴代码值的新列。然后将其加入您的原始表。按时间分组并使用 ifelse 创建一个新列以使用代码或您之前创建的列

dt <- dt[,.(code_temp=paste(ifelse(group!="B",code,""),collapse=", ")), by="time"][
dt, on="time"][
, Fcode := ifelse(group!="B",code,code_temp)][
group=="B",Fcode := substr(Fcode,1,nchar(Fcode)-2)]

最后一段代码去掉了结尾的逗号。

这与您对问题的描述和问题中的输出相匹配,但我不确定您对 C 组等的引用。

【讨论】:

  • 这是非常手动的。 OP 应该如何使用它?手动编写每个组?
  • OP 没有分享足够的信息来说明,但大概是像%in% 这样最坏的情况。我是这样理解他们的问题的。
  • 如果问题不清楚,没有理由回答。
  • @DavidArenburg 组的层次结构如下:A 和 C 的代码保持不变。 B 的代码采用 A 上的值。时间戳为我们提供了关于哪些 A 代码应该替换 B 代码的信息。我们只有 3 个小组。
  • @DavidArenburg OP 指定 C 组应像 A 组一样对待,并且并未暗示存在其他组。使用!="B" 就足够了。但我很感激你的建议。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-26
  • 1970-01-01
相关资源
最近更新 更多