r - 将第二次出现在 R 的列中

标签 r conditional subset find-occurrences

我有一个非常简单的数据集:

ID    Value     Time  
1    censored    1  
1    censored    2  
1   uncensored   3  
1   uncensored   4  
1    censored    5  
1    censored    6  
2    censored    1  
2   uncensored   2   
2   uncensored   3  
2   uncensored   4  
2    censored    5  

我想保留第一个 uncensored 出现,并且我想在 censored 之后保留第一个 uncensored 出现。例如:
ID   Value       Time
1    uncensored   3  
1    censored     5  
2    uncensored   2  
2    censored     5

不是每个人在时间 5 都有他们的第一个审查日期,这只是一个例子。Value 是一个二进制变量:1 表示已审查,0 表示未审查,但我已经标记了它们。

最佳答案

这是另一个可能的 data.table 解决方案

library(data.table)
setDT(df1)[, list(Value = c("uncensored", "censored"), 
                  Time =  c(Time[match("uncensored", Value)],
                          Time[(.N - match("uncensored", rev(Value))) + 2L])),
                  by = ID]
#    ID      Value Time
# 1:  1 uncensored    3
# 2:  1   censored    5
# 3:  2 uncensored    2
# 4:  2   censored    5

或者类似地,使用 which 而不是 match
setDT(df1)[, list(Value = c("uncensored", "censored"), 
                  Time =  c(Time[which(Value == "uncensored")[1L]],
                          Time[(.N - which(rev(Value) == "uncensored")[1L]) + 2L])),
                  by = ID]

关于r - 将第二次出现在 R 的列中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30975927/

相关文章:

r - 根据月份日期向数据表添加季节列

r - lm.fit(x,y,offset = offset, single.ok,...) 中的错误 0 个使用 boxcox 公式的非 NA 情况

r - 计算xts加权和时如何避免for循环?

r - 使用 count()、aggregate()、data.table() 或 dplyr() 汇总数据(均值、标准差)

java - 重构复杂的 if 条件

r - R中的子集数据框

R - 根据条件处理数据框行

language-agnostic - 使用 if() 加上立即返回是一种公认​​的做法吗?

r - 括号使向量不同。矢量表达式究竟是如何计算的?

r - 在 R 中通过 lhs 对规则进行子集化