【问题标题】:Extract previous value by group from other group column从其他组列中按组提取上一个值
【发布时间】:2017-11-05 19:43:21
【问题描述】:

我有一个数据框:

ID_1  <- c("A","B","C","D","A","A","B","E","D","F","H")
ID_2  <- c("G","D","I","A","J","B","K","D","A","H","A")
Value <- c(10,9,15,27,3,28,4,3,11,19,12)
DF <- as.data.frame(cbind(ID_1, ID_2, Value))

我想要一个新列,其中包含基于另一列 ('ID_2') 中相应 ID 的给定 ID ('ID_1') 的最后一个(即前一个)值 ('Value')。换句话说:预期的解决方案应该找到给定 ID ('ID_1') 的最新/最后一个 ID 条目 ('ID_2'),并在新列中提取相应的值 ('Value')。

最终的数据集应如下所示(在现有的三列中添加一列;插图):

NEW    <- c(NA,NA,NA,9,27,27,28,NA,3,NA,19)
DF_NEW <- as.data.frame(cbind(ID_1, ID_2, Value, NEW))

提前感谢您的帮助!

【问题讨论】:

    标签: r datatable dplyr tidyr


    【解决方案1】:

    一种选择是在DF上创建一个行号列,然后使用data.table滚动连接:

    library(data.table)
    setDT(DF)[, rn := seq_len(.N)]
    
    DF[DF, 
        on=.(ID_2 = ID_1, rn = rn), 
        .(ID_1 = i.ID_1, ID_2 = i.ID_2, Value = i.Value, New = x.Value), 
        roll=Inf
    ]
    
    #    ID_1 ID_2 Value New
    # 1:    A    G    10  NA
    # 2:    B    D     9  NA
    # 3:    C    I    15  NA
    # 4:    D    A    27   9
    # 5:    A    J     3  27
    # 6:    A    B    28  27
    # 7:    B    K     4  28
    # 8:    E    D     3  NA
    # 9:    D    A    11   3
    #10:    F    H    19  NA
    #11:    H    A    12  19
    

    【讨论】:

    • 酷 :) 有效!谢谢你,Psidom!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-15
    • 1970-01-01
    相关资源
    最近更新 更多