用 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
我想用 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