R如何使用较高的列值对数据表进行子集化(以便子集表示列总和的80%)

时间:2017-05-15 16:49:55

标签: r subset

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

这是一种优雅的方式吗?

例如,这里是一个无序的数据表,'com.android.application' android { compileSdkVersion 23 buildToolsVersion '25.0.0' defaultConfig { applicationId "my.editable.project" minSdkVersion 15 targetSdkVersion 23 versionCode 28 versionName "1.4.4" multiDexEnabled true } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro' } } productFlavors { } lintOptions { disable 'MissingTranslation' checkReleaseBuilds false } dexOptions { javaMaxHeapSize "4g" } } dependencies { compile fileTree(dir: 'libs', include: ['*.jar']) compile files('libs/ksoap2-android-assembly-3.5.0-jar-with-dependencies.jar') //compile files('libs/gcm.jar') //compile files('libs/gcm-src.jar') compile project(':firebase_plugin') compile 'com.android.support:appcompat-v7:23.1.1' compile 'com.android.support:design:23.1.1' compile 'com.android.support:support-v4:23.1.1' compile 'com.google.android.gms:play-services:9.0.2' compile 'com.google.android.gms:play-services-ads:9.0.2' compile 'com.google.android.gms:play-services-auth:9.0.2' compile 'com.google.android.gms:play-services-gcm:9.0.2' compile 'com.android.support:multidex:1.0.1' compile 'com.android.support.constraint:constraint-layout:1.0.2' compile 'com.google.firebase:firebase-config:10.0.1' } apply plugin: 'com.google.gms.google-services'` 列包含感兴趣的值(ECART_H; sum = 10307.08),子集化应该只选择第3行:和4 :( 0.8*sum = 8245)这样,这两行是要选择的最小行数> sum= 8428之和的80%。

ECART_H

3 个答案:

答案 0 :(得分: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%。

答案 1 :(得分:2)

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

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 :(得分:0)

好的基于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过滤器以选择感兴趣的行。大行(表示&gt; =总和的80%)和/或直到达到总和的80%的行(选择行直到达到总和的80%(p.ex.过滤器(pcCUM <= 80))将得到结果如果一行代表超过总和的80%,则选择无行

DPLYR rock和data.table

如果可以翻译data.table语言中的第一部分......