【问题标题】:Top quintiles for several categorical values几个分类值的前五分之一
【发布时间】:2017-06-26 18:26:52
【问题描述】:

一般来说,我想获得一列分布的数据框的前五分之一。但是,它必须是另一列的每个唯一分类值的前五分之一。

我想它必须分几个步骤来完成,可能需要一个循环。首先,我需要根据唯一的分类值分离数据帧,然后只保留每个新数据帧的前五分位数,最后再将数据帧重新绑定在一起。 但我不知道该怎么做。

一些样本数据:

dat <- data.frame(x = rep(letters[1:3],times = 5),
                  y = rep(1:3,each = 5))
    > dat
   x y
1  a 1
2  b 1
3  c 1
4  a 1
5  b 1
6  c 2
7  a 2
8  b 2
9  c 2
10 a 2
11 b 3
12 c 3
13 a 3
14 b 3
15 c 3

在第 1 步中,我想为每个唯一的分类值创建一个数据框。类似的东西:

> df.a
     x y
    1  a 1
    2  a 1
    3  a 2
    4  a 2
    5  a 3

df.b 和 df.c 相应

在第二步中,我只想保留每个新数据框的前五分之一。比如:

应该变成这样:

> df.a=df.a[df.a$y > quantile(df.a, 0.5, na.rm = TRUE),]
     # taking the top 50% because the top quintile would not work with the sample data. 

在最后一步,我需要重新绑定所有新的数据帧。

【问题讨论】:

    标签: r loops dataframe unique


    【解决方案1】:

    正如您所指出的,您的示例数据很难使用五分位数,因此我将稍微更改您的示例数据。

    ## New data
    dat <- data.frame(x = rep(letters[1:3],times = 25),
                      y = sample(10, 75, replace=TRUE))
    

    没有必要为分类变量的每个值制作单独的 data.frames 以获得五分位数。你可以通过aggregate 做到这一点。

    Limits = aggregate(dat$y, list(dat$x), quantile, 0.8)
    row.names(Limits) = Limits[,1]
    (Limits = Limits [,-1, drop=FALSE])
        x
    a 8.0
    b 7.2
    c 8.0
    

    现在,有了按类别划分的(顶部)五分位数表,我们可以只选择原始数据中高于这些五分位数的那部分(按类别)。

    TopQuintile = dat[which(dat$y >= Limits[dat$x,1]), ]
    

    【讨论】:

      猜你喜欢
      • 2022-01-12
      • 1970-01-01
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-09-07
      • 2011-01-26
      相关资源
      最近更新 更多