使用3种不同的向量条件过滤数据框

时间:2017-09-16 04:45:56

标签: r

我的样本数据集

df <- data.frame(period=rep(1:3,3), 
             product=c(rep('A',9)), 
             account= c(rep('1001',3),rep('1002',3),rep('1003',3)),
             findme= c(0,0,0,1,0,1,4,2,0))

我想要的输出数据集

output <- data.frame(period=rep(1:3,2), 
                 product=c(rep('A',6)), 
                 account= c(rep('1002',3),rep('1003',3)),
                 findme= c(1,0,1,4,2,0))

我的条件是.... 我想根据以下条件从9中删除3条记录。

  1. 如果我的所有句号(1,2和3)满足“findme”值等于'Zero'和
    1. 如果发生在同一产品上并且
    2. 和同一帐户。
  2. 规则1:应符合第1,2,3期 规则2:所有期间的Findme值= 0 规则3:所有这3条记录(Preiod 1,2,3)应该具有相同的产品 规则4:所有这3个帐户(期间1,2,3)应该有一个帐户。

2 个答案:

答案 0 :(得分:2)

如果我理解正确,您希望从产品帐户组合中删除所有记录,其中findme == 0,如果此组合中包含所有期间?

library(dplyr)

df %>%
  group_by(product, account, findme) %>% 
  mutate(all.periods = all(1:3 %in% period)) %>%
  ungroup() %>%
  filter(!(findme == 0 & all.periods)) %>%
  select(-all.periods)

# A tibble: 6 x 4
  period product account findme
   <int>  <fctr>  <fctr>  <dbl>
1      1       A    1002      1
2      2       A    1002      0
3      3       A    1002      1
4      1       A    1003      4
5      2       A    1003      2
6      3       A    1003      0

答案 1 :(得分:1)

以下是data.table

的选项
library(data.table)
setDT(df)[df[, .I[all(1:3 %in% period) & !all(!findme)], .(product, account)]$V1]
#   period product account findme
#1:      1       A    1002      1
#2:      2       A    1002      0
#3:      3       A    1002      1
#4:      1       A    1003      4
#5:      2       A    1003      2
#6:      3       A    1003      0