我有一个数据集
dtf<-data.frame(id=c("A","A","A","A","B","B","B","B"), value=c(2,4,6,8,4,6,8,10))
Run Code Online (Sandbox Code Playgroud)
对于每个id,值按升序排序
我想减少dtf,使每个id值超过指定限制时只包含第一行.每个只有一行id,并且应该是value第一行超过指定限制的行.
对于此示例,对于5dtf 的限制应减少为:
A 6
B 6
Run Code Online (Sandbox Code Playgroud)
这是一个很好的方法吗?
非常感谢
它可以通过以下方式完成aggregate:
dtf<-data.frame(id=c("A","A","A","A","B","B","B","B"), value=c(2,4,6,8,4,6,8,10))
limit <- 5
aggregate(value ~ id, dtf, function(x) x[x > limit][1])
Run Code Online (Sandbox Code Playgroud)
结果:
id value
1 A 6
2 B 6
Run Code Online (Sandbox Code Playgroud)
更新:多列的解决方案:
示例数据框,dtf2:
dtf2 <- data.frame(id=c("A","A","A","A","B","B","B","B"),
value=c(2,4,6,8,4,6,8,10),
col3 = letters[1:8],
col4 = 1:8)
Run Code Online (Sandbox Code Playgroud)
解决方案包括ave:
with(dtf2, dtf2[ave(value, id, FUN = function(x) cumsum(x > limit)) == 1, ])
Run Code Online (Sandbox Code Playgroud)
结果:
id value col3 col4
3 A 6 c 3
6 B 6 f 6
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
720 次 |
| 最近记录: |