我有一个像:
这样的数据集+----+-------+---------+----------+--+ | 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吗?
答案 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
),然后filter
组all
' 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