我正在尝试根据每个user_id
和order_date
对数据框进行子集化。
如果ecomm_id
和pulse_id
的行中存在userid
和order_date
,则应该将该行选为新数据框。
否则,只有一行没有ecomm_id
必须被选择到新数据框,所有其他行必须被丢弃。
示例数据:
userid returning device store_n testid ecomm_id pulse_id order_date
1.00 1 0 9328 Experience E 1 23 7/25/2015
1.00 1 0 NA Experience E NA NA 7/25/2015
2.00 1 1 NA Experience C NA NA 7/14/2015
3.00 1 0 3486 Experience F 2 86 7/23/2015
3.00 1 0 NA Experience F NA NA 7/24/2015
3.00 1 0 NA Experience F NA NA 7/24/2015
预期产出:
userid returning device store_n testid ecomm_id pulse_id order_date
1.00 1 0 9328 Experience E 1 23 7/25/2015
2.00 1 1 NA Experience C NA NA 7/14/2015
3.00 1 0 3486 Experience F 2 86 7/23/2015
3.00 1 0 NA Experience F NA NA 7/24/2015
答案 0 :(得分:1)
希望这有帮助!
df <- data.frame(userid=c(1,1,2,3,3,3),
returning=c(1,1,1,1,1,1),
device=c(0,0,1,0,0,0),
store_n=c(9328,NA,NA,3486,NA,NA),
testid=c('Experience E','Experience E','Experience C','Experience F','Experience F','Experience F'),
ecomm_id=c(1,NA,NA,2,NA,NA),
pulse_id=c(23,NA,NA,86,NA,NA),
order_date=c('7/25/2015','7/25/2015','7/14/2015','7/23/2015','7/24/2015','7/24/2015')
)
library(dplyr)
df1 <- unique(df) %>% group_by(userid,order_date) %>% summarise(count=n())
df1 <- merge(unique(df),df1,on=c(userid,order_date))
final_df <- df1[!(is.na(df1$ecomm_id) & is.na(df1$pulse_id) & df1$count > 1),-ncol(df1)]
如果它解决了您的问题,请不要忘记告诉我们:)
答案 1 :(得分:1)
使用data.table
,这变成了简洁的“一线”:
library(data.table)
setDT(DT)[order(ecomm_id), .SD[1], keyby = .(userid, order_date)]
userid order_date returning device store_n testid tid ecomm_id pulse_id 1: 1.00 7/25/2015 1 0 9328 Experience E 1 23 2: 2.00 7/14/2015 1 1 NA Experience C NA NA 3: 3.00 7/23/2015 1 0 3486 Experience F 2 86 4: 3.00 7/24/2015 1 0 NA Experience F NA NA
按ecomm_id
排序,NA
条目移至底部。现在,对于userid
和order_date
的每个组合,挑选该组中的第一个元素。
请注意,这假设在非NA ecomm_id
的情况下,每个组最多只有一个条目,因为OP指定了:
如果
ecomm_id
和pulse_id
的行中存在userid
和order_date
,则应该将该行选为新数据帧。