【问题标题】:Applying ifelse with a grouping variable将 ifelse 与分组变量一起应用
【发布时间】: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&gt;quantile(x,0.75),1,0)) ?
  • 天啊,我忘了ave。你介意把这个作为答案吗?
  • Np,我有点怀疑这个问题是骗人的,所以我将其作为评论留下。不过,其他任何人都可以随意将其转换为答案。如果您需要经常分组,我建议您使用dplyrdata.table
  • 哦,我的意思是 setDT(data_frame)[ , disc := +(x&gt;quantile(x,0.75)), by=season] 而不是 0/1,您也可以考虑使用 R 的 logical/Boolean 类来处理此类问题。
  • 哦抱歉,我忘记测试了。用index 替换x 后,它为我运行(在data.table 1.9.5 上):setDT(data_frame)[ , disc := +(index&gt;quantile(index,0.75)), by=season]

标签: r if-statement group-by tapply


【解决方案1】:

你可以使用dplyr:

library(dplyr)
data_frame %>% group_by(season) %>%
               mutate(disc = +(percent_rank(index) > 0.75))

   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

使用 + 编辑,将 TRUE FALSE 转换为 Frank 的数字

【讨论】:

  • 对于二进制变量来说,整数比数字好,是吗? Fwiw,+x 可以用来代替as.integer(x) 以获得较低的代码高尔夫分数。
  • 使用原始函数 data_frame 的相同解决方案 %>% group_by(season) %>% mutate(disc = ifelse(index > quantile(index,0.75),1,0))
  • + 有点病态——太好了!
猜你喜欢
  • 1970-01-01
  • 2021-05-16
  • 1970-01-01
  • 1970-01-01
  • 2023-01-18
  • 2014-09-05
  • 2011-09-16
  • 1970-01-01
  • 2018-04-02
相关资源
最近更新 更多