我在2 - 5年内观察了许多受试者,并且每年询问他们是否有特定症状("是"或"不")。我想计算这个症状 - 状态/变量改变了多少次,即轮班次数(从"否"到"是"或从"是"到& #34; no")在每个科目的观察期(第1年到第5年)。不幸的是,我有一个主题没有回答的主题。这些NA应该被忽略。
subject<-c("a","b","c","d")
year1 <- c("no", "yes", NA, NA)
year2 <- c("yes", "yes", NA, "yes")
year3 <- c("no", "yes", "yes", NA)
year4 <- c("yes", "yes", NA, "no")
year5 <- c("yes", "yes", "yes", NA)
df = data.frame(subject, year1, year2, year3, year4, year5)
df
如何创建新的数字变量&#34; df $ shifting&#34; [班次数(n)]? 在这个例子中,&#34; df $ shift&#34;应该变成3,0,0,1。
答案 0 :(得分:1)
我们可以循环遍历行,获取非NA元素的rle
,提取&#39;值&#39;,获取不相等的相邻元素的sum
将其分配到新列&#39; shift&#39;。
df$shifts <- apply(df[-1], 1, function(x) {x1 <- rle(x[!is.na(x)])$values
sum(x1[-1]!= x1[-length(x1)])})
#[1] 3 0 0 1