【问题标题】:Split dataframe column into quantile with no duplication of quantile for any value in R将数据框列拆分为分位数,R 中的任何值均不重复分位数
【发布时间】:2020-05-22 07:50:12
【问题描述】:

我有一个如下定义的数据框:

  structure(list(value = c(1, 1, 2, 2, 2, 2, 2, 3, 4, 5)), class = "data.frame", row.names = c(NA, 
-10L)) 

我想将列“值”拆分为“n”分位数(假设 n=3),这样任何值都不应落入 2 个分位数。 例如:值 '2' 应该得到唯一的分位数

我尝试使用下面的'ntile'函数

df1 <- mutate(df,R_rank=ntile(df$value,3))

结果是:

structure(list(value = c(1, 1, 2, 2, 2, 2, 2, 3, 4, 5), R_rank = c(1L, 
1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 3L)), class = "data.frame", row.names = c(NA, 
-10L))

这里的值“2”属于 2 个不同的分位数(1 和 2),但我希望任何值都应该属于唯一的分位数。

如何在 R 中做到这一点?

【问题讨论】:

  • 你能显示你的预期输出吗?
  • 我已经编辑了我的问题。请立即查看
  • 那不是你期望的输出,那是你不想要的输出。

标签: r quantile


【解决方案1】:

或许你可以使用cut

cut(df$value, 3, labels = FALSE)
#[1] 1 1 1 1 1 1 1 2 3 3

在哪里

df$value #is
#[1] 1 1 2 2 2 2 2 3 4 5

所以 1-2 属于第 1 组,3 属于第 2 组,4-5 属于第 3 组。

【讨论】:

    【解决方案2】:

    也许解决方案是将quantile 参数type 设置为默认值type = 7 以外的值。

    n <- 3
    
    q5 <- quantile(V, probs = seq(0, 1, length.out = n + 1), type = 5)
    q6 <- quantile(V, probs = seq(0, 1, length.out = n + 1), type = 6)
    q8 <- quantile(V, probs = seq(0, 1, length.out = n + 1), type = 8)
    q9 <- quantile(V, probs = seq(0, 1, length.out = n + 1), type = 9)
    

    并拆分输入向量:

    split(V, findInterval(V, q5))
    split(V, findInterval(V, q6))
    split(V, findInterval(V, q8))
    split(V, findInterval(V, q9))
    

    上面的split 指令都给出了相同的结果。见下文。

    通过以下代码找到值 5、6、8 和 9:

    sapply(1:9, function(i)
      quantile(V, probs = seq(0, 1, length.out = n + 1), type = i)
    )
    #          [,1] [,2] [,3] [,4]     [,5]     [,6] [,7]     [,8]     [,9]
    #0%           1    1    1    1 1.000000 1.000000    1 1.000000 1.000000
    #33.33333%    2    2    2    2 2.000000 2.000000    2 2.000000 2.000000
    #66.66667%    2    2    2    2 2.166667 2.333333    2 2.222222 2.208333
    #100%         5    5    5    5 5.000000 5.000000    5 5.000000 5.000000
    

    由于第 5、6、8 和 9 列的 2/3 分位数不同于 2,因此可以选择这些类型来解决问题。

    2/3 分位数都在 2 到 3 之间,这就是为什么 split 指令都输出相同列表的原因。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-23
      • 1970-01-01
      • 1970-01-01
      • 2023-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-24
      相关资源
      最近更新 更多