Как создать переменную, которая регистрирует запись в исследовании, используя переменную возраста в продольном наборе данных? - PullRequest
0 голосов
/ 12 июня 2019

По сути, у меня есть продольный набор данных, и это включает в себя 8 волн сбора данных.Итак, у меня есть 8 возрастных переменных age_1:age_8, и если участник входит в волну 1, его возраст записывается в age_1, в противном случае его значение устанавливается как NA.Точно так же, если участники вошли в исследование на волне 2, их возраст записывается в age_2 и также записывается возраст наблюдения участников, которые вошли в предыдущую волну (волна 1), но если участник входит впоследующие волны (не волна 1 или 2) их возраст указан как NA.Поэтому я надеюсь, что это несколько прояснит, из чего состоят данные.То, что я хочу сделать, - это создать переменную, в которой будет записан только возраст, который человек ввел в исследование.

То, что я пытался сделать, - это что-то вроде этого (я знаю, это ужасно), это просто высказывания, например, в entry_2, если age_2 (волна 2) - это NA и age_1не NA, тогда запись записывается как NA, но в противном случае она принимает значение, записанное для возраста на волне 2, в качестве записи.Поэтому я пытаюсь просто взять возраст людей, которые вошли в эту конкретную волну, и исключить любые последующие возрасты из предыдущих волн, которые могли быть записаны.Но это не работает, так как он просто копирует переменную возраста, как показано в примере ниже.

data$entry_2 <- ifelse(is.na(data$age_2) & !is.na(data$age_1), NA, data$age_2)
data$entry_3 <- ifelse(is.na(data$age_3) & !is.na(data$age_1) & !is.na(data$age_2), NA, data$age_3)```

Output: 

summary(data$entry_2)
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
12.00   58.00   69.00   64.64   72.00  102.00    9076 

summary(data$age_2)
Min. 1st Qu.  Median    Mean 3rd Qu.    Max.    NA's 
12.00   58.00   69.00   64.64   72.00  102.00    9076

Ответы [ 3 ]

0 голосов
/ 12 июня 2019

Последний абзац немного запутан в отношении того, что конкретно вы ищете, но, вероятно, будет лучше использовать dplyr и tidyr здесь для достижения этой цели.

library(dplyr)
library(tidyr)
#' Example data
test = data.frame(participant = c("a", "b", "c", "d"), age_1 = c(NA, 10, NA, NA), age_2 = c(14, 11, NA, NA), age_3 = c(NA, 12, NA, 16), age_4 = c(NA, 14, 10, 17), age_5 = c(NA, NA, NA, NA))
test2 <- test %>% gather(key = "wave", value = "age", -participant) %>% group_by(participant) %>% mutate(previous_age = lag(age)) %>% ungroup() %>% mutate(is_entry = ifelse(is.na(previous_age) & !is.na(age), 1, 0)) %>% select(-previous_age)

Это будет4 столбца: участник, какая это волна, возраст этой волны и была ли эта волна входом для этого участника.Отсюда вы можете выполнить свой анализ, группируя по волнам и is_entry, чтобы получить сводные данные.

0 голосов
/ 12 июня 2019

Решение для возраста, представленное в длинном формате данных.

id wave age
 1    1   3
 1    2   6
 1    3   9
 1    4  10
 2    1  NA
 2    2  NA
 2    3   5
 2    4   9

Есть

tapply(df$age, df$id, min, na.rm=F)

, чтобы получить

[1] 3 5
0 голосов
/ 12 июня 2019

Я думаю, это должно дать вам то, что вам нужно:


first_entry <- function(subj) {
    na.omit(subj)[1]
}

age_df <- data.frame(
    age_1 = c(NA, NA, 1, NA),
    age_2 = c(1, NA, 3, NA),
    age_3 = c(2, NA, 4, 4),
    age_4 = c(3, 4, 5, 5)
)

  age_1 age_2 age_3 age_4
1    NA     1     2     3
2    NA    NA    NA     4
3     1     3     4     5
4    NA    NA     4     5

youngest <- apply(age_df, 1, first_entry)

youngest
[1] 1 4 1 4

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...