【问题标题】:R: based on consecutive values in two rows, populate a thirdR:基于两行中的连续值,填充第三行
【发布时间】:2018-11-17 22:12:54
【问题描述】:

我感觉有一个dplyr 解决方案,但我无法做到。

我有一个数据框:

Name     Job     ID1     ID2
Name1    Job1    ID1a    ID2a
                 ID1a    ID2a
Name2    Job2    ID1b    ID2b
Name3    Job3    ID1c    ID2c

每当 ID1 和 ID2 列值重复时,我想插入一个名为“wait”的字符串。所以最终的数据框应该是这样的:

Name     Job     ID1     ID2
Name1    Job1    ID1a    ID2a
         wait    ID1a    ID2a
Name2    Job2    ID1b    ID2b
Name3    Job3    ID1c    ID2c

我的数据框中有数万行。这些重复 ID 相当频繁地出现。每次重复 ID1 和 ID2 时,我都想插入相同的“等待”字符串。我如何在 R 中做到这一点?

【问题讨论】:

    标签: r


    【解决方案1】:

    数据

    df <- read.table(text="Name     Job     ID1     ID2
    Name1    Job1    ID1a    ID2a
    NA       NA      ID1a    ID2a
    Name2    Job2    ID1b    ID2b
    Name3    Job3    ID1c    ID2c", header=TRUE)
    

    您可以使用data.table::rleid 对连续重复的 ID 值进行分组

    library(dplyr)
    ans <- 
      df %>%
        group_by(G = data.table::rleid(paste(ID1, ID2))) %>%
        mutate(Job = c(head(Job, 1), rep("wait", times=n()-1))) %>%
        ungroup %>%
        select(-G)
    ans
    
       # Name  Job  ID1  ID2
    # 1 Name1    1 ID1a ID2a
    # 2  <NA> wait ID1a ID2a
    # 3 Name2    2 ID1b ID2b
    # 4 Name3    3 ID1c ID2c
    

    【讨论】:

    • 如何防止 R 打印结果? 10,000 列后空间不足。
    • 这不会测试顺序重复。复制函数与rle函数不一样。
    • @42 我只希望这发生在 2 个序列,而不是 3 个或更多序列上。
    • 我根据之前的答案接受了这个,这完全符合我的需要!
    【解决方案2】:

    这是一个使用data.table的选项

    library(data.table)
    setDT(df)[df[, .I[seq_len(.N) > 1], .(rleid(ID1, ID2))]$V1, Job := 'wait']
    df
    #    Name  Job  ID1  ID2
    #1: Name1 Job1 ID1a ID2a
    #2:  <NA> wait ID1a ID2a
    #3: Name2 Job2 ID1b ID2b
    #4: Name3 Job3 ID1c ID2c
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多