Я работаю с панельными данными, где некоторые вопросы анкеты задаются только один раз, в то время как большинство других задается несколько раз на разных волнах. Итак, предположим, что у меня есть ответы на опрос по категориальной переменной.
Хотя вполне вероятно, что участники группы будут стабильно отвечать на заданный вопрос, может случиться так, что они изменят свое мнение или даже выйдут из группы. Другие могут войти в панель позже (в более поздней волне).
Допустим, это приводит к набору данных, который выглядит следующим образом, где var_1a и var_1b — две переменные, которые измеряют одно и то же, только в двух разных волнах:
mydata<-data.frame(
var_1a = c(1,2,3,4,5,NA),
var_1b = c(1,2,5,5,NA,NA)
)
Теперь я хотел бы автоматически объединить эти переменные в одну переменную для двух волн. В качестве условия я бы хотел взять среднее, если респонденты изменили свое мнение с одной волны на другую. Более того, я хотел бы сохранить ответ от волны 1, даже если респондент выпал из панели в волне 2.
Я делал это в R с помощью этой функции:
combo<-function(x,...){
V<-rowMeans(x[, c(...) ], na.rm=T) *
ifelse(rowMeans(is.na(x[, c(...) ])) == ncol(x[, c(...) ]), NA, 1)
ifelse(is.nan(V),NA,V)}
По какой-то причине это вводит «NaN», если все переменные последовательно NA для всех волн, следовательно, последняя строка кода в функции.
Это прекрасно работает, и я получаю то, что хотел:
> mydata$combo_var<-combo(mydata, c("var_1a","var_1b"))
> mydata
var_1a var_1b combo_var
1 1 1 1.0
2 2 2 2.0
3 3 -3 0.0
4 4 9 6.5
5 5 NA 5.0
6 NA NA NA
7 NA NA NA
8 NA NA NA
9 NA NA NA
10 NA NA NA
Однако мне было интересно, есть ли лучший и простой способ сделать это. Есть ли способ сделать то же самое с помощью dplyr? Любое решение tidyverse?
Некоторые
tidyverse
варианты:Данные
Опция 1
Результат:
Вариант 2
Результат:
Хорошо спасибо. Но знаете ли вы, почему вводится
NaN
, а не только НП? — person Fabian Habersack; 08.08.2019NaN (не число) обычно происходит при выполнении вычислений, но результат не может быть представлен в числовом виде. Если бы мы установили
na.rm = F
, он вернул быNA
для строк 5 и 6. Поскольку мы сказалиrowMeans
удалить NA, у нас в основном есть результат, который невозможно вычислить, поэтому NaN. Ключевым моментом здесь является то, что значение не отсутствует, но не может быть вычислено. — person Fabian Habersack; 08.08.2019небольшое изменение в опции
pmap
— person Fabian Habersack; 08.08.2019Вы могли бы выразить это немного яснее, избегая
ifelse
s.Данные