返回组内超过0.8的第一个值

时间:2017-05-17 11:47:55

标签: r dataframe percentile

data<-data.frame(c(A,A,A,A,B,B,B,C,C,C),c(0.2,0.78,0.82,0,1,0.1,0.81,1,0.8,0.92,1))

我想在每组中只选择前80%(A,B)。意味着我不能使用普通的&lt;。有什么想法吗?

1 个答案:

答案 0 :(得分:0)

使用data.table

library(data.table)

data <-
  data.table(
    "GroupID"  = c("A", "A", "A", "A", "B", "B", "B", "C", "C", "C", "C"),
    "Value" = c(0.2, 0.78, 0.82, 0, 1, 0.1, 0.81, 1, 0.8, 0.92, 1)
  )

data[, head(Value, n = floor(nrow(.SD) * 0.8)), by = GroupID]

根据您希望将观察次数舍入为80%的方式,在floorceiling(或round)之间进行选择。 (3个观察结果的80%是什么?2或3)

更改0.8以控制百分比。

head表示前80%,tail表示最后80%。

输出:

      GroupID   V1
1:       A 0.20
2:       A 0.78
3:       A 0.82
4:       B 1.00
5:       B 0.10
6:       C 1.00
7:       C 0.80
8:       C 0.92

修改: 我刚刚意识到你的标题和正文似乎意味着两个不同的问题。

以下是标题问题的答案:

data[Value > 0.8, first(Value), by = GroupID]

输出:

  GroupID   V1
1:       A 0.82
2:       B 1.00
3:       C 1.00