【问题标题】:Dealing with grouped dataset in R在 R 中处理分组数据集
【发布时间】:2015-11-03 14:15:02
【问题描述】:

我有一个像这样的数据集:

+----+--------+---------+----------+--+ |编号 |时间 |活动 |时差 | | +----+--------+---------+----------+--+ | 1 | 15.00 |安装 | - | | | 1 | 15.30 |出售| 00.30 | | | 1 | 16.00 |出售| 00.30 | | | 2 | 15.00 |出售| - | | | 2 | 15.30 |出售| 0.30 | | | 3 | 16.00 |安装 | - | | | 4 | 15.00 |安装 | - | | | 5 | 13.00 |安装 | - | | | 5 | 14.00 |出售| 01.00 | | +----+--------+---------+----------+--+

我想清理这个数据集: 我想排除第一个(和下一个 n..)事件是销售但不是安装的 id。 我想排除有安装但没有销售的 id(这些 id 确实是唯一的)

最终得到如下结果:

+----+--------+---------+----------+ |编号 |时间 |活动 |时差 | +----+--------+---------+----------+ | 1 | 15.00 |安装 | - | | 1 | 15.30 |出售| 0.30 | | 1 | 16.00 |出售| 0.30 | | 5 | 13.00 |安装 | - | | 5 | 14.00 |出售| 01.00 | +----+--------+---------+----------+

如何在 R 中做到这一点?是否有任何特定的数据操作包,或者我可以使用 if 公式?我应该使用tapply吗?

【问题讨论】:

  • 您已经尝试过什么了吗?为什么它不起作用?
  • 将来尝试发布代码以重现您的数据,因为上述表格格式不能轻易转换为 R 对象。

标签: r dplyr tapply


【解决方案1】:

基于示例,我们可以按“id”和filter 将“事件”列分组,其中first 元素为“安装”,第二个为“销售”,以获得预期的输出。

df1 %>%
  group_by(id) %>%
  filter(first(event)=='install' & event[2L]=='sale')
    id  time   event timediff
#  (int) (dbl)   (chr)    (dbl)
#1     1  15.0 install       NA
#2     1  15.3    sale      0.3
#3     1  16.0    sale      0.3
#4     5  13.0 install       NA
#5     5  14.0    sale      1.0

或者如果除了第一个元素之外的所有元素都应该是“sale”,我们通过比较 first 元素为“install”和后续元素为“sale”来创建一个逻辑变量(“ind”)(使用@987654325 @),然后是 filter 组,其中 all 'ind' 为 TRUE。如果需要,我们可以使用 select 删除“ind”列。

 df1 %>% 
     group_by(id) %>%
     mutate(ind= first(event)=='install' & lead(event, default='sale')=='sale') %>%
     filter(all(ind)) %>% 
     ungroup() %>% 
     select(-ind)

或者我们可以使用data.table.,按'id'分组,if行数大于1(.N >1),第一个元素是'install'(event[1L]=='install')和all其余元素都是“sale”,然后我们得到 Data.table (.SD) 的子集。

library(data.table)
setDT(df1)[, if(.N > 1 & event[1L]=='install' & all(event[2:.N]=='sale')) .SD, by = id]
#   id time   event timediff
#1:  1 15.0 install       NA
#2:  1 15.3    sale      0.3
#3:  1 16.0    sale      0.3
#4:  5 13.0 install       NA
#5:  5 14.0    sale      1.0

【讨论】:

  • 它有效!但我不太了解参数 [2L] 的逻辑。这是什么意思?
猜你喜欢
  • 1970-01-01
  • 2017-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-18
  • 1970-01-01
相关资源
最近更新 更多