【问题标题】:R How to subset datatable with higher values of a column (so that the subset represent 80% of the column sum)R如何对具有较高列值的数据表进行子集化(以便子集代表列总和的80%)
【发布时间】:2017-05-15 16:49:54
【问题描述】:

我有一个包含因子和数值的数据表。我想要的是对该数据表进行子集化以仅选择较高的值。这些较高值的总和必须代表列总和的 80%。

有没有优雅的方法?

例如,这是一个无序数据表,ECART_H 列包含感兴趣的值 (sum = 10307.08;0.8*sum = 8245),子集应导致仅选择第 3 行:和第 4 行:(sum= 8428),以便这 2 行是至少要选择的行数 > 80% 的总和 ECART_H

  REGROUP FAMILLE      TREND       RMSE    ECART_H
1:      10     A03   48.43853   675.7492  470.45737
2:      10     A04   61.65814   599.2031  795.08575
3:      10     H01  269.07728 12004.1214 6974.29642
4:      10     N01 -170.30563  6282.8133 1455.44291
5:      10     S01  147.61121  2711.0511  529.22545
6:      10     D06   13.64792   167.9315   82.57669

【问题讨论】:

  • 多少个值被认为是更高的值?也许library(zoo);df1[df1[, which(rollsum(ECART_H, 2) > (0.8 * sum(ECART_H))) + 0:1]]

标签: r subset


【解决方案1】:

使用 cume_dist 的 dplyr 解决方案。为方便起见,显示了变异,我不确定您是否需要分组。

df %>% 
  group_by(REGROUP) %>%
  arrange(ECART_H)  %>%
  mutate(c = cume_dist(ECART_H)) %>%
  filter(c >= 0.8)

#   REGROUP FAMILLE     TREND      RMSE  ECART_H         c
#     <int>   <chr>     <dbl>     <dbl>    <dbl>     <dbl>
# 1      10     N01 -170.3056  6282.813 1455.443 0.8333333
# 2      10     H01  269.0773 12004.121 6974.296 1.0000000

【讨论】:

    【解决方案2】:

    我这样做了:

    df <- df[order(-df$ECART_H),]
    
    df$cumsum <- cumsum(df$ECART_H)
    
    df$cumfreq <- cumsum(df$ECART_H)/sum(df$ECART_H)
    
    df <- df[ (df$cumsum <= 0.8), ]
    

    但这两个值(第 3 行:和第 4 行:)是 81.8%,高于 80%。

    【讨论】:

      【解决方案3】:

      好的,基于 Epi99 的答案,经过一些修改:从较大的值排列到较小的值,然后执行 cumsum 而不是 cumdist,然后进行过滤。

      这样我只有第一行代表所有值总和的 80%。 (例如,以帕累托方法的方式工作并专注于重要的事情)

      test <- dfCONSO_FAM_TREND %>%
        group_by(REGROUP) %>%
        filter(ECART_H>0) %>%
        arrange(-ECART_H)  %>%
        mutate(pc=ECART_H/sum(ECART_H)*100) %>%
        mutate(pcCUM=cumsum(pc))
      
      dfFOCUS_FAM <- dfFOCUS_FAM[(dfFOCUS_FAM$pc>=80 | dfFOCUS_FAM$pcCUM<=80),]
      

      已添加最后一个 data.table 过滤器以选择感兴趣的行。大行(代表总和的> = 80%)和/或直到达到总和的80%的行(选择行直到达到总和的80%(p.ex. filter(pcCUM

      DPLYR 和 data.table 一样

      如果有人可以用 data.table 语言翻译第一部分...

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-04-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-09-09
        • 1970-01-01
        相关资源
        最近更新 更多