我的数据看起来像这样。我现在要做的是创建一个新列“Acceptance Count”,我想在“1”出现之前的“Acceptance”列中找到0出现的次数,对于“Customer ID”的每个相同值
NULL
另外我想要另一个新列“折扣计数”,如果第一次1出现在每个“客户ID”的“接受”中,它应该是1,折扣值也是1.如果其他明智, “折扣计数”应为0.如果“客户ID”的所有值的“接受”为0,则“接受计数”和“折扣计数”都应为N / A
**例如,客户ID 211在第三个实例中接受因此“接受计数”应为2,并且当“折扣”为1时,“接受”第一次读取1,因此“折扣计数”应为1,客户ID 194在第二个实例中接受,因此“Acceptance Count”为1,并且当Discount为0时它接受,因此“Discount Count”为0。
预期结果:
Customer ID | Acceptance | Discount
211 0 1
211 0 0
211 1 1
202 1 1
202 0 0
194 0 0
202 0 1
194 1 0
194 0 1
198 0 1
我希望我能够清楚地知道我在寻找什么,非常感谢你的帮助。
此外,我有250,000个不同的客户ID和750,000个总数据条目。
答案 0 :(得分:0)
有点hacky,但这是我认为做你想要的解决方案:
df %>%
group_by(customer_id) %>%
summarize(acceptance_count = ifelse(rle(Acceptance)$values[1] == 0 & rle(Acceptance)$values[2] == 1, rle( Acceptance)$lengths[1], NA),
discount_count = as.integer(Discount[min(which(Acceptance == 1))] == 1))
答案 1 :(得分:0)
这是一次尝试,但我相信198和202都有接受全部零,这意味着接受计数和折扣计数都应该是NA。
search.create({
type: 'customer',
filters: ['contact.internalid', 'anyof', contactID],
columns: [
'entityid',
'altname',
'email',
'contact.email',
],
});
编辑:条件澄清。
-if Acceptance在1之前有1,Acceptance_Count =和零
# Your data
df <- structure(list(Customer_ID = c(211, 211, 211, 202, 202, 194, 202, 194, 194, 198),
Acceptance = c(0, 0, 1, 0, 0, 0, 0, 1, 0, 0),
Discount = c(1, 0, 1, 1, 0, 0, 1, 0, 1, 1)),
.Names = c("Customer_ID", "Acceptance", "Discount"),
row.names = c(NA, -10L), class = "data.frame")
# Desired output
df.split <- split(df, df$Customer_ID)
out <- t(sapply(df.split, function(x){
a.1 <- which(x$Acceptance == 1)
d.1 <- which(x$Discount == 1)
A_C <- ifelse(length(a.1) > 0, max(a.1) - length(a.1), 0)
D_C <- ifelse(any(a.1[1] == d.1), 1, ifelse(sum(x$Acceptance) == 0, NA, 0))
A_C <- ifelse(is.na(D_C), NA, A_C)
setNames(c(A_C, D_C), c("Acceptance_Count","Discount_Count"))
}))
out <- cbind.data.frame(Customer_ID = as.numeric(rownames(out)), out)
out <- out[order(match(rownames(out), df$Customer_ID)),]
rownames(out) <- NULL
out
# Customer_ID Acceptance_Count Discount_Count
#1 211 2 1
#2 202 0 1
#3 194 1 0
#4 198 NA NA
-if Discount与Acceptance的第一个1位于同一行 - &gt; Dicount_Count = 1
Acceptance Discount
0 0
0 0
1 0
Acceptance_Count Discount_Count
2 0
- 如果接受全部为零 - &gt; Acceptance_Count&amp;折扣计数= NA
Acceptance Discount
0 0
0 0
1 1
Acceptance_Count Discount_Count
2 1
- 其他可能性
Acceptance Discount
0 0
0 0
0 0
Acceptance_Count Discount_Count
NA NA