R 对于另一个变量的所有相同值,在一个变量中第一次出现一个数字之前查找计数

R 对于另一个变量的所有相同值,在一个变量中第一次出现一个数字之前查找计数,r,R,我的数据看起来像这样。我现在要做的是创建一个新列“Acceptance Count”,其中我要查找“1”出现之前,0出现在“Acceptance”列中的次数,对于“Customer ID”的每个相同值 另外,我想有另一个新的列“折扣计数”,其中应该是1,如果每个“客户ID”的“接受”中第一次出现1,折扣值也是1。如果按其他方式,“折扣计数”应为0。如果“客户ID”的所有值的“接受”均为0,则“接受计数”和“折扣计数”均应为N/a **例如,客户ID 211在第三个实例中接受,因此“接受计数”应为

我的数据看起来像这样。我现在要做的是创建一个新列“Acceptance Count”,其中我要查找“1”出现之前,0出现在“Acceptance”列中的次数,对于“Customer ID”的每个相同值

另外,我想有另一个新的列“折扣计数”,其中应该是1,如果每个“客户ID”的“接受”中第一次出现1,折扣值也是1。如果按其他方式,“折扣计数”应为0。如果“客户ID”的所有值的“接受”均为0,则“接受计数”和“折扣计数”均应为N/a

**例如,客户ID 211在第三个实例中接受,因此“接受计数”应为2,当折扣为1时,“接受”第一次读取1,因此“折扣计数”应为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
我希望我能清楚地知道我在寻找什么,非常感谢你的帮助


另外,我有250000个不同的客户ID和750000个总数据条目。

有点粗糙,但我认为有一个解决方案可以满足您的需要:

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))

有点骇人,但我认为有一个解决方案可以满足您的需求:

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))

这里是一个尝试,但我相信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
-如果折扣的1与承兑的第一个1在同一行->贴现计数=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

这里是一个尝试,但我相信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
-如果折扣的1与承兑的第一个1在同一行->贴现计数=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

你能解释一下202的结果吗?为什么
202
的接受计数为
2
,而
198
的接受计数为
NA
?它们都只有零,对吗?对不起,这是我在原始表中犯的一个错误,是的,它的第一个条目本身就有1。谢谢你能解释一下202的结果吗?为什么
202
的接受计数为
2
,而
198
的接受计数为
NA
?它们都只有零,对吗?对不起,这是我在原始表中犯的一个错误,是的,它的第一个条目本身就有1。谢谢你好,埃文,谢谢你的回答,我试过了,但是当接受计数仍然为0时,有些值显示折扣计数为NA,这与您在这里显示的输出不同。如果在“承兑”中全部为0,则承兑计数和折扣计数都应为NA。折扣计算不应仅限于NA。谢谢,我的代码只在没有1的情况下为折扣计数写NA——在这种情况下,接受计数也应该是NA。你能粘贴给我原始的Customer_ID部分,它给你一个NA而不是另一个吗?嗨,Evan,谢谢你的回答,我尝试了这个,但是当接受计数仍然为0时,一些值显示折扣计数为NA,这与你在这里显示的输出不同。如果在“承兑”中全部为0,则承兑计数和折扣计数都应为NA。折扣计算不应仅限于NA。谢谢,我的代码只在没有1的情况下为折扣计数写NA——在这种情况下,接受计数也应该是NA。你能把原始的客户ID部分粘贴给我吗?它给出了一个NA而不是另一个NA?