R 在忽略NA'的情况下,计算每个ID的访问量(总和);s和0';s
我有以下建议:R 在忽略NA'的情况下,计算每个ID的访问量(总和);s和0';s,r,na,cumsum,R,Na,Cumsum,我有以下建议: df <- data.frame(ID = c(1,1,2,2,2,3,3,3,3), Attendance = c(1, 1, NA, 1,1, NA, 1, NA, 1 )) df我们可以使用data.table。将“data.frame”转换为“data.table”(setDT(df)),按“ID”分组,将i指定为逻辑向量,这对于“Attention”中的非NA元素是正确的,将(:=)attention的“rowid”指定为“Vi
df <- data.frame(ID = c(1,1,2,2,2,3,3,3,3),
Attendance = c(1, 1, NA, 1,1, NA, 1, NA, 1 ))
df我们可以使用data.table
。将“data.frame”转换为“data.table”(setDT(df)
),按“ID”分组,将i
指定为逻辑向量,这对于“Attention”中的非NA元素是正确的,将(:=
)attention的“rowid”指定为“Visit”列。然后,将“访问”中的NA替换为0
library(data.table)
setDT(df)[!is.na(Attendance), Visit := rowidv(Attendance),
ID][is.na(Visit), Visit := 0]
df
# ID Attendance Visit
#1: 1 1 1
#2: 1 1 2
#3: 2 NA 0
#4: 2 1 1
#5: 2 1 2
#6: 3 NA 0
#7: 3 1 1
#8: 3 NA 0
#9: 3 1 2
或者,如果我们使用的是ave
,则为非NA行创建索引,然后对这些行使用ave
i1 <- !is.na(df$Attendance)
df$Visit <- 0
df$Visit[i1] <- with(df[i1, ], ave(Attendance, ID, FUN = cumsum))
i1我们可以使用data.table
。将“data.frame”转换为“data.table”(setDT(df)
),按“ID”分组,将i
指定为逻辑向量,这对于“Attention”中的非NA元素是正确的,将(:=
)attention的“rowid”指定为“Visit”列。然后,将“访问”中的NA替换为0
library(data.table)
setDT(df)[!is.na(Attendance), Visit := rowidv(Attendance),
ID][is.na(Visit), Visit := 0]
df
# ID Attendance Visit
#1: 1 1 1
#2: 1 1 2
#3: 2 NA 0
#4: 2 1 1
#5: 2 1 2
#6: 3 NA 0
#7: 3 1 1
#8: 3 NA 0
#9: 3 1 2
或者,如果我们使用的是ave
,则为非NA行创建索引,然后对这些行使用ave
i1 <- !is.na(df$Attendance)
df$Visit <- 0
df$Visit[i1] <- with(df[i1, ], ave(Attendance, ID, FUN = cumsum))
i1
i1 <- !is.na(df$Attendance)
df$Visit <- 0
df$Visit[i1] <- with(df[i1, ], ave(Attendance, ID, FUN = cumsum))
library(dplyr)
df %>%
group_by(ID) %>%
mutate(Visit = if_else(is.na(Attendance), 0, cumsum(if_else(is.na(Attendance), 0, 1))))