【问题标题】:How to get top n % and button n% in data frame in R [duplicate]如何在R中的数据框中获得前n%和按钮n%[重复]
【发布时间】:2021-04-27 00:28:07
【问题描述】:

这是我的数据:

dat <- read.table(text = "id    val1    val2    vt
1   14  12  19
2   13  13  12
3   12  12  13
4   12  13  13
5   12  14  22
6   12  12  14
7   12  13  14
8   12  14  12
9   13  13  14
10  13  14  14
11  14  14  14
12  13  14  17
13  13  14  31
14  13  13  14
15  13  14  13
16  13  14  23
                
", header = TRUE)

我想根据 vt 获得前 25% 和后 45%。

这是输出 前25%

id  val1    val2    vt
13  13  14  31
16  13  14  23
5   12  14  22
1   14  12  19

前 45% 是

id  val1    val2    vt
7   12  13  14
9   13  13  14
10  13  14  14
11  14  14  14
14  13  13  14
3   12  12  13
4   12  13  13
15  13  14  13
2   13  13  12
8   12  14  12

我尝试过使用分位数的子集(),它似乎不适用于底部的 n%。 dplyr可以做到吗?我检查了其他链接,他们没有提供底部的 n%。另外,我不想被任何团体获得。

【问题讨论】:

  • 请检查 tidyverse 中的 slice_maxslice_min 函数。
  • 我已编辑问题。请尽可能打开它

标签: r dplyr


【解决方案1】:

使用dplyr::slice_min()dplyr::slice_max()

library(dplyr)
library(magrittr)

df <- read.table(text = "id    val1    val2    vt
1   14  12  19
2   13  13  12
3   12  12  13
4   12  13  13
5   12  14  22
6   12  12  14
7   12  13  14
8   12  14  12
9   13  13  14
10  13  14  14
11  14  14  14
12  13  14  17
13  13  14  31
14  13  13  14
15  13  14  13
16  13  14  23
                
", header = TRUE)

df %>% slice_max(order_by = vt, prop = 0.25)
#   id val1 val2 vt
# 1 13   13   14 31
# 2 16   13   14 23
# 3  5   12   14 22
# 4  1   14   12 19

df %>% slice_min(order_by = vt, prop = 0.45)
#    id val1 val2 vt
# 1   2   13   13 12
# 2   8   12   14 12
# 3   3   12   12 13
# 4   4   12   13 13
# 5  15   13   14 13
# 6   6   12   12 14
# 7   7   12   13 14
# 8   9   13   13 14
# 9  10   13   14 14
# 10 11   14   14 14
# 11 14   13   13 14

【讨论】:

  • 如果你有类似的值,它不会正确地切片顶部和按钮 n%
  • @user330 你能详细说明一下吗?
  • 比如31出现5次,你得到的是5行而不是4行,
  • 所以您不希望相同的vt 值被视为不同的(值)?
  • 相同的值不是问题。我想编码行为正确。例如,如果我们有 16 个值,则需要在顶部切片 4,在底部切片 4
【解决方案2】:

也许你可以试试findInterval + quantile 如下所示

res <- with(dat, split(dat, findInterval(vt, quantile(vt, c(.45, .75)), left.open = TRUE)))
res_45bottom <- head(res, 1)[[1]]
res_25top <- tail(res, 1)[[1]]

这样

> res_45bottom
   id val1 val2 vt
2   2   13   13 12
3   3   12   12 13
4   4   12   13 13
6   6   12   12 14
7   7   12   13 14
8   8   12   14 12
9   9   13   13 14
10 10   13   14 14
11 11   14   14 14
14 14   13   13 14
15 15   13   14 13

> res_25top
   id val1 val2 vt
1   1   14   12 19
5   5   12   14 22
13 13   13   14 31
16 16   13   14 23

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-12-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-04
    • 2018-08-10
    相关资源
    最近更新 更多