将for循环转换为-apply函数,其中输入是数据帧而不是向量
我有一个包含3列的数据,大致如下所示:将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
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)