【问题标题】:how to filter rows in dataframe for specific groups having values less than 1st quartile for 2 columns in R?如何为 R 中 2 列的值小于第一个四分位数的特定组过滤数据框中的行?
【发布时间】:2017-05-11 12:15:37
【问题描述】:

我有一个多行少列的 data.frame。我已经对它们进行了分组,现在我想选择特定组中的行,这些行的值应该小于该组的 2 列的第一个四分位数。 以下数据:

df:


ID  SD_1        SD_2        clust
4   1.613479812 2.231100475 1
6   2.348970134 4.509710677 1
7   676.6791703 855.1300148 1
8   5.702718972 9.789694982 1
17  0.69905969  1.736578132 1
18  45.94251574 32.40374486 2
20  6.655940714 6.602647859 2
21  0.367147263 0.447369751 2
22  4.316702479 6.618716644 2
25  7.481365283 7.955022446 2
32  14.916817   71.70158686 2
33  0.311656121 0.947110959 2
34  0.555539595 0.438893998 2
36  2.754111181 5.586499991 2
42  8.718620333 12.50393499 3
2   17.04906625 7.825923801 3
3   9.337794688 2.805759945 3
9   3.028141567 4.965291633 3
39  0.770520551 0.676955176 3
55  8.765592871 6.058640263 3
67  0.863034955 1.150017033 3

以上是一种数据,我需要对每个集群值列的行进行子集化,以便对它们进行分组,并将值小于等于df$SD_1df$SD2 的第一个四分位数的行进行子集化。

R 中是否有函数或包可以做到这一点?我使用tapply() 通过将行与集群列分组来查找行的第一个四分位数,但现在我想为 df$SD1 和 df$SD2 的第一个四分位数以下的每个集群值过滤这些行。我确信 R 中有一些班轮,但我无法做到这一点。 即使它不是单行的,那么我应该如何在 R 中实现它。

【问题讨论】:

    标签: r subset


    【解决方案1】:

    使用data.table,您可以执行以下操作:

    require(data.table)
    setDT(df)
    df_sub <- df[,  c("QSD_1", "QSD_2") := lapply(.SD, quantile, probs = .25), 
       by = group, .SDcols = c("SD_1", "SD_2")][SD_1 <= QSD_1 & SD_2 <= QSD_2]
    

    【讨论】:

    • 酷它工作。我试图用 ddply() 但后来我在硬编码。这一款非常适合。谢谢
    猜你喜欢
    • 2016-08-12
    • 2022-07-18
    • 1970-01-01
    • 2012-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-22
    相关资源
    最近更新 更多