我有一个包含因子和数值的数据表。我想要的是对这个数据表进行子集化以仅选择更高的值。这些更高值的总和必须代表列总和的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
答案 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语言中的第一部分......