gpt4 book ai didi

r - 按因子级别对 R 数据帧进行子集,在第一次超过阈值后删除所有行

转载 作者:行者123 更新时间:2023-12-04 12:29:06 24 4
gpt4 key购买 nike

我有一些网络 session 数据,我试图在上次访问经过一定时间(比如 10 天)后排除所有观察结果。我有一个 ID、一个 VisitNum 和一个计算的 DateDiff,表示自上次访问以来经过的天数。我的 ID 是因素,所以我需要解决方案在许多因素级别上工作。

样本数据:

test_data <- data.frame(ID=c("abc123","abc123","abc123","abc123"),
VisitNum=c(1,2,3,4),
DateDiff=c(0,5,30,5))

由于第 3 次访问发生在第 2 次访问后 30 天,我想从数据框中排除第 3 次和第 4 次访问。我提出的解决方案将排除第 3 次访问但保留第 4 次访问 - 这不是我需要的。

我想要的结果是这样的:
test_results <- data.frame(ID=c("abc123","abc123"),
VisitNum=c(1,2),
DateDiff=c(0,5))

谢谢!

最佳答案

对于此示例,您可以使用基本 R 函数 cummin :

test_data[as.logical(cummin(test_data$DateDiff < 10)), ]
ID VisitNum DateDiff
1 abc123 1 0
2 abc123 2 5

将此应用于多个 ID 时,您可以使用基本 R 函数 ave :
test_data[as.logical(ave(test_data$DateDiff, test_data$ID,
FUN=function(i) cummin(i < 10))), ]
ID VisitNum DateDiff
1 abc123 1 0
2 abc123 2 5
6 abc323 2 5
7 abc323 3 5

在这里, as.logical使用是因为我们依赖于逻辑子测试和 ave返回初始向量的众数。
data.table 中的等效操作将是
library(data.table
setDT(data.table)
test_data[as.logical(test_data[,cummin(DateDiff < 10), by=ID]$V1)]

数据
test_data <- 
structure(list(ID = structure(c(1L, 1L, 1L, 1L, 2L, 3L, 3L),
.Label = c("abc123", "abc223", "abc323"), class = "factor"),
VisitNum = c(1, 2, 3, 4, 2, 2, 3), DateDiff = c(0, 5, 30, 5, 20, 5, 5)),
Names = c("ID", "VisitNum", "DateDiff"), row.names = c(NA, -7L),
class = "data.frame")

关于r - 按因子级别对 R 数据帧进行子集,在第一次超过阈值后删除所有行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42461182/

24 4 0
文章推荐: r - 如何使用 ggplot2 绘制时间间隔数据
文章推荐: asp.net - IIS - 物理路径错误
文章推荐: r - ggplot2:更改geom_segment 甘特图中段的颜色?
文章推荐: safari - DOM 中不再有