2016-10-06 5 views
2

Я наблюдал за несколькими темами в течение 2-5 лет и каждый год спрашивал, есть ли у них определенный симптом («да» или «нет»). Я хочу подсчитать, сколько раз изменялось это состояние-состояние/переменная, то есть количество сдвигов (от «нет» до «да» или от «да» до «нет») в течение периода наблюдения (год 1 до 5) в пределах каждый предмет. К сожалению, у меня есть som 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 

Как создать новые числовые переменные "$ Df сдвигов" [Число сдвигов (п)]? В этом примере «сдвиги df $» должны стать 3,0,0,1.

ответ

1

Мы можем перебрать строки, получить rle элементов не-NA, извлечь «значения», получить sum смежных элементов, которые не равны, и присвоить его новым сдвигам столбца.

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 
+0

Из любопытства я попытался сделать это с помощью dplyr. Вы знаете, можно ли это сделать? 'df%>% select (-subject)%>% rowwise()%>% mutate (x1 = list (function (x) rle (x [! is.na (x)]) $ values))' не даже заставьте меня хранить x1. – Haboryme

+0

@Haboryme Вы можете называть 'df%>% rowwise()%>% do (' – akrun

+1

Не знаю 'do' Я попытаюсь с этим. Спасибо. – Haboryme

Смежные вопросы