R 计算一天中第一次失败后的所有观察结果

R 计算一天中第一次失败后的所有观察结果,r,R,以下是我的数据示例 Customer_id Seller_id transaction_date transaction_status 1 7 2010-03-10 SUCCESS 1 7 2010-03-10 FAIL 1 7 2010-03-10 SUCCESS 1 8

以下是我的数据示例

Customer_id  Seller_id   transaction_date   transaction_status
    1          7           2010-03-10         SUCCESS
    1          7           2010-03-10         FAIL
    1          7           2010-03-10         SUCCESS
    1          8           2010-03-10         SUCCESS
    2          9           2010-03-15         FAIL
    2          9           2010-03-15         FAIL
    3          10          2010-03-15         SUCCESS
    3          10          2010-03-15         FAIL
    3          10          2010-03-15         SUCCESS
    4          10          2010-03-15         FAIL
    4          10          2010-03-15         FAIL
    4          11          2010-03-15         SUCCESS
    5          12          2010-03-20         FAIL
我希望找到客户和卖家在给定日期第一次交易失败后的交易数量

我对R相当熟悉,但从未在其中编写过任何循环。
任何帮助都会很好。

示例数据

df = read.table(text = "
Customer_id  Seller_id   transaction_date   transaction_status
1          7           2010-03-10         SUCCESS
1          7           2010-03-10         FAIL
1          7           2010-03-10         SUCCESS
1          8           2010-03-10         SUCCESS
2          9           2010-03-15         FAIL
2          9           2010-03-15         FAIL
3          10          2010-03-15         SUCCESS
3          10          2010-03-15         FAIL
3          10          2010-03-15         SUCCESS
4          10          2010-03-15         FAIL
4          10          2010-03-15         FAIL
4          11          2010-03-15         SUCCESS
5          12          2010-03-20         FAIL
", header=T)
解决方案(对循环使用
dplyr
而不是


示例数据

df = read.table(text = "
Customer_id  Seller_id   transaction_date   transaction_status
1          7           2010-03-10         SUCCESS
1          7           2010-03-10         FAIL
1          7           2010-03-10         SUCCESS
1          8           2010-03-10         SUCCESS
2          9           2010-03-15         FAIL
2          9           2010-03-15         FAIL
3          10          2010-03-15         SUCCESS
3          10          2010-03-15         FAIL
3          10          2010-03-15         SUCCESS
4          10          2010-03-15         FAIL
4          10          2010-03-15         FAIL
4          11          2010-03-15         SUCCESS
5          12          2010-03-20         FAIL
", header=T)
解决方案(对
循环使用
dplyr
而不是


使用
dplyr
tidyr
的解决方案:

df %>% group_by(Customer_id,Seller_id, transaction_date) %>% 
  mutate(postfail=lag(transaction_status=="FAIL")) %>% 
  fill(postfail) %>% summarize(postfail_transactions=sum(postfail, na.rm=TRUE))
结果:

# A tibble: 7 x 3
# Groups:   Customer_id [?]
  Customer_id Seller_id postfail_transactions
        <int>     <int>                 <int>
1           1         7                     1
2           1         8                     0
3           2         9                     1
4           3        10                     1
5           4        10                     1
6           4        11                     0
7           5        12                     0
#一个tible:7 x 3
#组:客户id[?]
客户id卖家id失败后交易
1           1         7                     1
2           1         8                     0
3           2         9                     1
4           3        10                     1
5           4        10                     1
6           4        11                     0
7           5        12                     0
请注意,我统计第一次失败(包括进一步失败)后的所有事务


如果希望信息仅作为同一日期框中的另一列,请删除最后一步。

使用
dplyr
tidyr
的解决方案:

df %>% group_by(Customer_id,Seller_id, transaction_date) %>% 
  mutate(postfail=lag(transaction_status=="FAIL")) %>% 
  fill(postfail) %>% summarize(postfail_transactions=sum(postfail, na.rm=TRUE))
结果:

# A tibble: 7 x 3
# Groups:   Customer_id [?]
  Customer_id Seller_id postfail_transactions
        <int>     <int>                 <int>
1           1         7                     1
2           1         8                     0
3           2         9                     1
4           3        10                     1
5           4        10                     1
6           4        11                     0
7           5        12                     0
#一个tible:7 x 3
#组:客户id[?]
客户id卖家id失败后交易
1           1         7                     1
2           1         8                     0
3           2         9                     1
4           3        10                     1
5           4        10                     1
6           4        11                     0
7           5        12                     0
请注意,我统计第一次失败(包括进一步失败)后的所有事务


如果希望信息仅作为同一日期框中的另一列,请删除最后一步。

这里是第一次失败后的所有成功计数
count\u success
,以及第一次失败后的所有事务计数
count\u all

.N
是当前组中的行数,
which.max(fail)
给出了第一次出现的
fail
TRUE
,因此
.N-which.max(fail)
给出了第一次失败后的行数(事务)

如果行号
seq(.N)
大于第一个失败
的行号which.max(fail)
,并且失败是
FALSE
,则成功数被计为逻辑向量的总和,该逻辑向量为
TRUE
,即
!失败

library(data.table)
setDT(df)

# Number of Successful transactions after first failure
df[, {fail <- transaction_status == 'FAIL'
      .(count_all      = .N - which.max(fail), 
        count_success  = sum(!fail & (seq(.N) > which.max(fail))))}
   , by = .(Customer_id, Seller_id, transaction_date)]

#    Customer_id Seller_id transaction_date count_all count_success
# 1:           1         7       2010-03-10         1             1
# 2:           1         8       2010-03-10         0             0
# 3:           2         9       2010-03-15         1             0
# 4:           3        10       2010-03-15         1             1
# 5:           4        10       2010-03-15         1             0
# 6:           4        11       2010-03-15         0             0
# 7:           5        12       2010-03-20         0             0
库(data.table)
setDT(df)
#第一次失败后成功的事务数
df[,{fail which.max(fail))}
,by=(客户id、卖方id、交易日期)]
#客户\u id卖家\u id交易\u日期计数\u所有计数\u成功
# 1:           1         7       2010-03-10         1             1
# 2:           1         8       2010-03-10         0             0
# 3:           2         9       2010-03-15         1             0
# 4:           3        10       2010-03-15         1             1
# 5:           4        10       2010-03-15         1             0
# 6:           4        11       2010-03-15         0             0
# 7:           5        12       2010-03-20         0             0

这里是第一次失败后所有成功的计数
计数\u成功
,以及第一次失败后所有交易的计数
计数\u所有

.N
是当前组中的行数,
which.max(fail)
给出了第一次出现的
fail
TRUE
,因此
.N-which.max(fail)
给出了第一次失败后的行数(事务)

如果行号
seq(.N)
大于第一个失败
的行号which.max(fail)
,并且失败是
FALSE
,则成功数被计为逻辑向量的总和,该逻辑向量为
TRUE
,即
!失败

library(data.table)
setDT(df)

# Number of Successful transactions after first failure
df[, {fail <- transaction_status == 'FAIL'
      .(count_all      = .N - which.max(fail), 
        count_success  = sum(!fail & (seq(.N) > which.max(fail))))}
   , by = .(Customer_id, Seller_id, transaction_date)]

#    Customer_id Seller_id transaction_date count_all count_success
# 1:           1         7       2010-03-10         1             1
# 2:           1         8       2010-03-10         0             0
# 3:           2         9       2010-03-15         1             0
# 4:           3        10       2010-03-15         1             1
# 5:           4        10       2010-03-15         1             0
# 6:           4        11       2010-03-15         0             0
# 7:           5        12       2010-03-20         0             0
库(data.table)
setDT(df)
#第一次失败后成功的事务数
df[,{fail which.max(fail))}
,by=(客户id、卖方id、交易日期)]
#客户\u id卖家\u id交易\u日期计数\u所有计数\u成功
# 1:           1         7       2010-03-10         1             1
# 2:           1         8       2010-03-10         0             0
# 3:           2         9       2010-03-15         1             0
# 4:           3        10       2010-03-15         1             1
# 5:           4        10       2010-03-15         1             0
# 6:           4        11       2010-03-15         0             0
# 7:           5        12       2010-03-20         0             0

您所说的交易数量仅指“成功”案例?您希望如何存储该号码/信息?在与列相同的数据集中?不同的数据集?你能举个例子吗?谢谢安东尼奥。。给定条件下所需的事务数与状态无关(不管是失败还是成功)。是的,如果解决方案是相同数据集的列,那就太好了。好的,我会更新我的答案。您希望输出的格式是什么?您想在数据集中获取一个新列,还是只获取不同的组合?谢谢您的更新。如果我想计算客户和卖方之间第一笔交易失败后到下一个“n”天的交易数量,请告诉我在以下代码中添加什么?交易数量仅指“成功”案例?您希望如何存储该号码/信息?在与列相同的数据集中?不同的数据集?你能举个例子吗?谢谢安东尼奥。。给定条件下所需的事务数与s无关