【发布时间】:2015-08-20 21:19:33
【问题描述】:
我有包含索引和季节的数据,并且想离散化这些数据。我创建了一些假数据进行演示:
data_frame <- data.frame(index=c(10,233.2,12,44,56,232,1.4,43,76,89,20.3,23), season=c('Fall','Winter','Fall','Summer','Winter','Spring','Spring','Summer','Winter','Spring','Summer','Fall'))
data_frame
index season
1 10.0 Fall
2 233.2 Winter
3 12.0 Fall
4 44.0 Summer
5 56.0 Winter
6 232.0 Spring
7 1.4 Spring
8 43.0 Summer
9 76.0 Winter
10 89.0 Spring
11 20.3 Summer
12 23.0 Fall
由于在我的原始数据中,每个季节的分布是不同的,我想通过季节变量对索引分组进行离散化。我通过将 1 分配给组的第 75 个百分位以上的任何值并将 0 分配给低于该组的任何值来离散化数据。
我想要以下输出:
index season disc
1 10.0 Fall 0
2 233.2 Winter 1
3 12.0 Fall 0
4 44.0 Summer 1
5 56.0 Winter 0
6 232.0 Spring 1
7 1.4 Spring 0
8 43.0 Summer 0
9 76.0 Winter 0
10 89.0 Spring 0
11 20.3 Summer 0
12 23.0 Fall 1
我知道如何找到结果,但不是我需要的格式。我正在使用tapply 函数来离散化我的变量:
tapply(data_frame$index, data_frame$season, function(x) ifelse(x>quantile(x,0.75),1,0))
$Fall
[1] 0 0 1
$Spring
[1] 1 0 0
$Summer
[1] 1 0 0
$Winter
[1] 1 0 0
我将如何产生我需要的输出?
【问题讨论】:
-
ave(data_frame$index, data_frame$season, FUN = function(x) ifelse(x>quantile(x,0.75),1,0))? -
天啊,我忘了
ave。你介意把这个作为答案吗? -
Np,我有点怀疑这个问题是骗人的,所以我将其作为评论留下。不过,其他任何人都可以随意将其转换为答案。如果您需要经常分组,我建议您使用
dplyr或data.table。 -
哦,我的意思是
setDT(data_frame)[ , disc := +(x>quantile(x,0.75)), by=season]而不是 0/1,您也可以考虑使用 R 的logical/Boolean 类来处理此类问题。 -
哦抱歉,我忘记测试了。用
index替换x后,它为我运行(在data.table 1.9.5 上):setDT(data_frame)[ , disc := +(index>quantile(index,0.75)), by=season]
标签: r if-statement group-by tapply