我有一个数据集
dtf<-data.frame(id=c("A","A","A","A","B","B","B","B"), value=c(2,4,6,8,4,6,8,10))
对于每个 id,值按升序排序
我想减少 dtf 以仅包含每个
id
的第一行该值超过指定的限制。每个 id
只有一行, 那应该是 value
首先超过指定的限制。对于此示例和
5
的限制dtf 应该减少到:A 6
B 6
这是一个很好的方法吗?
非常感谢
最佳答案
可以用 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])
结果:
id value
1 A 6
2 B 6
更新:多列的解决方案:
示例数据框,
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)
一个解决方案包括
ave
:with(dtf2, dtf2[ave(value, id, FUN = function(x) cumsum(x > limit)) == 1, ])
结果:
id value col3 col4
3 A 6 c 3
6 B 6 f 6
关于根据值减少数据集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14005282/