根据R中的条件从数据框中选择一行

时间:2017-08-06 21:12:36

标签: mysql r dataframe

我正在尝试根据每个user_idorder_date对数据框进行子集化。

如果ecomm_idpulse_id的行中存在useridorder_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

2 个答案:

答案 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条目移至底部。现在,对于useridorder_date的每个组合,挑选该组中的第一个元素。

请注意,这假设在非NA ecomm_id的情况下,每个组最多只有一个条目,因为OP指定了:

  

如果ecomm_idpulse_id的行中存在useridorder_date,则应该将该行选为新数据帧。