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无关