查找计数直到第一次在变量中出现另一个变量的所有相同值的数字

时间:2017-06-27 03:57:25

标签: r

我的数据看起来像这样。我现在要做的是创建一个新列“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个总数据条目。

2 个答案:

答案 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