用 dplyr 替换 for 循环

replace for loop with dplyr

我想用 dplyr 选项替换这个简单的 for 循环:

df <- data.frame(ID=c(rep(7,3), rep(8,3), rep(9,3)), visit= c(rep(c(0, 180, 360),3)), value = c("Poor", NA, "High", "High", NA, "High", NA, "Poor", "Poor") )

vec <- sum(!is.na(df$value)[df$visit==0])

for (i in seq(180, 360, 180)) {
      tmp <- sum(!is.na(df$value)[df$visit==i])
      vec <- c(vec, tmp)
 }

获取不缺失'value'的长度向量,对于每个'visit' i:

 vec
[1] 2 1 3

一个简单的 dplyr 方法是 group_by 您的 visit 列,然后 sum 向上 value 而不是 NA

如果您希望使用数据框而不是向量,请忽略 pull(vec)

library(dplyr)

df %>% 
  group_by(visit) %>% 
  summarize(vec = sum(!is.na(value))) %>% 
  pull(vec)

[1] 2 1 3