【发布时间】:2017-12-18 21:49:26
【问题描述】:
我正在尝试在数据框中查找组中的特定模式。获取以下通过电子邮件下订单的数据框、下订单的人以及金额。
set.seed(123)
dates = sample(seq(as.Date("2017-01-01"),as.Date("2017-12-31"), by = 'day'), 2000, replace = TRUE)
amount <- sample(-50:100, 2000, replace = TRUE)
placedorder <- sample(c(NA, NA, NA, "jeff", "alex", "steve", "amy", "john", "larry", "ryan"), 2000, replace = TRUE)
email <- sample(paste0(1:200, "@gmail.com"), 2000, replace = TRUE)
df <- data.frame(dates, email, placedorder, amount, stringsAsFactors = FALSE)
我想按电子邮件地址查找所有这三个发生位置的组,和它们在日期连续出现的位置:
- 下达了一个正值且
placedorder为NA 的订单
- 在上述步骤后下单,负值且
placedorder为NA - 在第 2 步之后下订单,其值为 正,其中
placeholder为非不适用
示例:
# A tibble: 10 x 4
# Groups: email [1]
dates email placedorder amount
<date> <chr> <chr> <int>
1 2017-02-10 1@gmail.com <NA> 68 # satisfies #1
2 2017-02-27 1@gmail.com <NA> -21 # satisfies #2
3 2017-03-07 1@gmail.com jeff -9
4 2017-03-09 1@gmail.com steve -93
5 2017-03-14 1@gmail.com steve 22 # satisfies #3
6 2017-03-18 1@gmail.com steve -81
7 2017-04-28 1@gmail.com <NA> -12
8 2017-05-06 1@gmail.com <NA> 4
9 2017-06-03 1@gmail.com jeff -40
10 2017-06-03 1@gmail.com larry 13 #(this also satisfies #3)
上面的例子都在同一个email内,3个过滤器中的每一个在时间上一个接一个地发生。
我的尝试,我认为找到了这些发生的位置,但没有考虑日期和连续发生的情况。此外,最好将其过滤到仅这些订单。
df2 <- df %>%
group_by(email) %>%
filter(any(is.na(placedorder) & amount > 0),
any(is.na(placedorder) & amount < 0),
any(!is.na(placedorder) & amount > 0)
)
提前致谢!
【问题讨论】:
-
几个问题。当您说“之后”或仅根据数据集行号时,您是在谈论时间连续性?如果是临时的,请先对日期和电子邮件的数据集进行排序(对电子邮件进行排序以节省计算时间)。其次,您是否要过滤以同时满足所有三个条件?此外,如果您的问题是由于您的日期为 POSIXct 引起的,您可能希望根据需要将其转换为字符并再次转换回来,这很麻烦,但以后更容易调试(如果有注释)。
-
我的意思是“之后”,因为它发生在第一次出现之后的日期。我确实想过滤,以便在给定组内同时满足所有三个条件,并发生在一个接一个发生的日期(可以是日期之间的任何距离,只是必须在之后)
-
编辑帖子以显示示例