将for循环转换为-apply函数,其中输入是数据帧而不是向量

将for循环转换为-apply函数,其中输入是数据帧而不是向量,r,for-loop,tapply,R,For Loop,Tapply,我有一个包含3列的数据,大致如下所示: uid <- c(1,1,1,1,1,1,2,2,2) sale <- c(0,1,1,0,0,0,0,1,0) e <- as.data.frame(cbind(uid, sale)) e$uid <- as.factor(e$uid) e$sincesale <- NA UPD: 好的,老实说,我在昨晚和早上都试着自己解决问题,但没有找到新问题的解决方案。我尝试使用建议的方法,但一个小问题是,他们从第一行开始计算“sin

我有一个包含3列的数据,大致如下所示:

uid <- c(1,1,1,1,1,1,2,2,2)
sale <- c(0,1,1,0,0,0,0,1,0)
e <- as.data.frame(cbind(uid, sale))
e$uid <- as.factor(e$uid)
e$sincesale <- NA
UPD:

好的,老实说,我在昨晚和早上都试着自己解决问题,但没有找到新问题的解决方案。我尝试使用建议的方法,但一个小问题是,他们从第一行开始计算“sincesale”(因为第一行的sale==0是真的,即使销售不是从开始). 以下示例输入使用for循环(“sincesale”)并使用建议的dplyr(“sincesale4”)生成结果:


uid使用
ave
查看每个
uid
组,并获得非销售日的累计金额
cumsum

e$sincesale2 <- ave(!e$sale, e$uid, FUN=cumsum)-1

#  uid sale sincesale sincesale2
#1   1    0        NA          0
#2   1    1        NA          0
#3   1    1        NA          0
#4   1    0         1          1
#5   1    0         2          2
#6   1    0         3          3
#7   2    0        NA          0
#8   2    1        NA          0
#9   2    0         1          1
dplyr
,帽尖指向@RonakShah:

library(dplyr)
e %>%
  group_by(uid) %>%
  mutate(sincesale4 = cumsum(!sale)-1)

使用
ave
查看每个
uid
组,并获取非销售日的累计金额
cumsum

e$sincesale2 <- ave(!e$sale, e$uid, FUN=cumsum)-1

#  uid sale sincesale sincesale2
#1   1    0        NA          0
#2   1    1        NA          0
#3   1    1        NA          0
#4   1    0         1          1
#5   1    0         2          2
#6   1    0         3          3
#7   2    0        NA          0
#8   2    1        NA          0
#9   2    0         1          1
dplyr
,帽尖指向@RonakShah:

library(dplyr)
e %>%
  group_by(uid) %>%
  mutate(sincesale4 = cumsum(!sale)-1)
只是
e只是
e
library(dplyr)
e %>%
  group_by(uid) %>%
  mutate(sincesale4 = cumsum(!sale)-1)