我有以下数据:
len = 1000
vint1 = vint1=sample(1:150,len,replace=TRUE)
vch1=sample(LETTERS[1:5],len,replace=TRUE)
vbin1=sample(letters[1:2],len,replace=TRUE)
mydf = data.frame(vint1, vch1, vbin1)
但是我必须创建另一列“类别”,其中应根据以下规则包含条目:
'N' if < 90th percentile
'cat1' if >=90th and <95th percentile
'cat2' if >=95th and <99th percentile
'cat3' if >99th percentile
始终检查 vch1 和 vbin1 的百分位数。
我可以通过以下代码确定该组 vch1 和 vch2 的 Vint1 值是否 > 90%:
with(mydf, ave(vint1, vch1, vbin1, FUN=function(x) x>quantile(x,0.9)))
但是我怎样才能分类呢?
编辑:
我尝试了以下代码。想确认一下是否可以或者有没有更好的方法:
with(mydf, ave(vint1, vch1, vbin1, FUN=function(x)
ifelse(x<quantile(x,0.9), 'N',
ifelse(x<quantile(x,0.95),'cat1',
ifelse(x<(quantile(x,0.99)),'cat2','cat3'
)))
)
)
这是来自以下的后续问题:Categorize dataframe by percentile in R
最佳答案
这可能会有所帮助。使用 dplyr
中的 group_by
、ntile
以及您的 ifelse
语句,我得出了以下结果。
library(dplyr)
group_by(mydf, vch1, vbin1) %>%
mutate(check = ntile(vint1, 100),
out = ifelse(check > 99, "cat3",
ifelse(between(check, 95, 99), "cat2",
ifelse(between(check, 90, 95), "cat1", "N")))) %>%
ungroup()
# A part of the outcome
# vint1 vch1 vbin1 check out
#1 138 C b 88 N
#2 66 B a 39 N
#3 24 D a 16 N
#4 141 B a 90 cat1
#5 27 C a 13 N
#6 29 C a 16 N
#7 11 D b 4 N
#8 24 B b 21 N
#9 72 E a 46 N
#10 25 C b 15 N
想法
transform(mydf,
check = ave(vint1, vch1, vbin1, FUN=function(x){
ifelse(x<quantile(x,0.9), 'N',
ifelse(x<quantile(x,0.95),'cat1',
ifelse(x<(quantile(x,0.99)),'cat2','cat3'
)))
})
)
# vint1 vch1 vbin1 check
#1 90 D b N
#2 136 C b cat1
#3 55 B a N
#4 56 B b N
#5 56 D a N
#6 100 A b N
关于r - 在 R 中创建百分位类别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27340090/