我的数据看起来像这样。我现在想要做的是创建一个新列“接受计数”,我想在“1”出现之前找到“接受”列中出现 0 的次数,对于每个相同的“客户 ID”值
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
另外我想有另一个新列“折扣计数”,如果第一次出现在每个“客户 ID”的“接受”中,它应该是 1,折扣值也是 1。否则,“折扣计数” " 应为 0。如果“客户 ID”的所有值的“接受”为 0,则“接受计数”和“折扣计数”均应为 N/A
** 例如,客户 ID 211 在第三次接受时,“Acceptance Count”应为 2,当 Discount 为 1 时,“Acceptance”第一次应为 1,因此“Discount Count”应为 1,客户 ID 为 194在第二个实例中接受,因此“接受计数”为 1,当折扣为 0 时接受,因此“折扣计数”为 0。
预期结果:
Customer ID | Acceptance Count | Discount Count
211 2 1
202 0 1
194 1 0
198 N/A N/A
我希望我能够清楚我在寻找什么,非常感谢您的帮助。
此外,我有 250,000 个不同的客户 ID,总共有 750,000 个数据条目。
这是一个尝试,但我相信 198 和 202 的接受度都为零,这意味着接受度数和折扣数都应为 NA。
# 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
编辑:条件澄清。
-如果 Acceptance 为 1,则 Acceptance_Count = 和 1 之前的零
Acceptance Discount
0 0
0 0
1 0
Acceptance_Count Discount_Count
2 0
-如果 Discount 的 1 与 Acceptance 的第一个 1 位于同一行 -> Dicount_Count = 1
Acceptance Discount
0 0
0 0
1 1
Acceptance_Count Discount_Count
2 1
-如果验收全为零 -> 验收计数 & 折扣计数 = NA
Acceptance Discount
0 0
0 0
0 0
Acceptance_Count Discount_Count
NA NA
-其他可能性
Acceptance Discount
1 0
0 1
1 0
Acceptance_Count Discount_Count
1 0
Acceptance Discount
0 0
0 1
0 1
Acceptance_Count Discount_Count
NA NA
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句