【问题标题】:Labeling each value in a column by grouping from another column R通过从另一列 R 分组来标记列中的每个值
【发布时间】:2016-06-03 22:41:09
【问题描述】:

我需要处理一个不寻常的数据集,并且我创建了一个小规模、可重复的示例。

library(data.table)
DT <- data.table(Type = c("A", rep("", 4), "B", rep("", 3), "C", rep("", 5)), Cohort = c(NA,1:4, NA, 5:7, NA, 8:12))
dt <- data.table(Type = c(rep("A", 4), rep("B", 3), rep("C", 5)), Cohort = 1:12)

我需要 DT 看起来像 dt 并且实际数据集有 680 万行。我意识到这可能是一个简单的问题,但我似乎无法弄清楚,也许是setkey?任何帮助表示赞赏,谢谢。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您可以将“”替换为NA 并使用zoo 包中的na.locf

    library(zoo)
    DT[Type=="",Type:=NA][,Type:=na.locf(Type)][!is.na(Cohort)]
    

    【讨论】:

    【解决方案2】:

    这是另一个不使用na.locf 的选项。按逻辑向量(Type!="")的累积和分组,我们选择第一个'Type'和'Cohort'的lead值,将其分配(:=)给'DT'的names替换原始列值并使用na.omit 替换NA 行。

    na.omit(DT[, names(DT) :=  .(Type[1L], shift(Cohort, type="lead")), cumsum(Type!="")])
    #     Type Cohort
    # 1:    A      1
    # 2:    A      2
    # 3:    A      3
    # 4:    A      4
    # 5:    B      5
    # 6:    B      6
    # 7:    B      7
    # 8:    C      8
    # 9:    C      9
    #10:    C     10
    #11:    C     11
    #12:    C     12
    

    【讨论】:

      猜你喜欢
      • 2016-02-24
      • 2017-09-12
      • 2021-05-16
      • 1970-01-01
      • 1970-01-01
      • 2017-08-12
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多