处理R中的分组数据集

时间:2015-11-03 14:15:02

标签: r dplyr tapply

我有一个像:

这样的数据集
+----+-------+---------+----------+--+
| id | time  |  event  | timediff |  |
+----+-------+---------+----------+--+
|  1 | 15.00 | install | -        |  |
|  1 | 15.30 | sale    | 00.30    |  |
|  1 | 16.00 | sale    | 00.30    |  |
|  2 | 15.00 | sale    | -        |  |
|  2 | 15.30 | sale    | 0.30     |  |
|  3 | 16.00 | install | -        |  |
|  4 | 15.00 | install | -        |  |
|  5 | 13.00 | install | -        |  |
|  5 | 14.00 | sale    | 01.00    |  |
+----+-------+---------+----------+--+

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

最终获得如下结果:

+----+-------+---------+----------+
| id | time  |  event  | timediff |
+----+-------+---------+----------+
|  1 | 15.00 | install | -        |
|  1 | 15.30 | sale    | 0.30     |
|  1 | 16.00 | sale    | 0.30     |
|  5 | 13.00 | install | -        |
|  5 | 14.00 | sale    | 01.00    |
+----+-------+---------+----------+

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

1 个答案:

答案 0 :(得分:1)

根据这个例子,我们可以按“ID&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元素与&#39进行比较来创建逻辑变量(' ind') ;安装'以及作为' sale' (使用lead),然后filterall' ind'是的。如果需要,我们可以删除' ind'列使用select

 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),第一个元素是& #39;安装' (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