Я хочу создать новую переменную, которая равна значению одной из двух других переменных, обусловленной значениями других переменных. Вот пример игрушки с поддельными данными.
Каждая строка кадра данных представляет студента. Каждый студент может изучать до двух предметов (subj1
и subj2
) и может проходить степень ( "BA" ) или несовершеннолетний ( "MN" ) у каждого испытуемого. Мои реальные данные включают в себя тысячи студентов, несколько типов степеней, около 50 предметов, а учащиеся могут иметь до пяти майоров/несовершеннолетних.
ID subj1 degree1 subj2 degree2
1 1 BUS BA <NA> <NA>
2 2 SCI BA ENG BA
3 3 BUS MN ENG BA
4 4 SCI MN BUS BA
5 5 ENG BA BUS MN
6 6 SCI MN <NA> <NA>
7 7 ENG MN SCI BA
8 8 BUS BA ENG MN
...
Теперь я хочу создать шестую переменную df$major
, которая равна значению subj1
, если subj1
является основным основным учеником или значением subj2
, если subj2
является основным. Первичный майор - первый предмет со степенью, равной "BA". Я попробовал следующий код:
df$major[df$degree1 == "BA"] = df$subj1
df$major[df$degree1 != "BA" & df$degree2 == "BA"] = df$subj2
К сожалению, у меня появилось сообщение об ошибке:
> df$major[df$degree1 == "BA"] = df$subj1
Error in df$major[df$degree1 == "BA"] = df$subj1 :
NAs are not allowed in subscripted assignments
Я предполагаю, что это означает, что векторизованное присваивание не может использоваться, если присваивание оценивается как NA хотя бы для одной строки.
Я чувствую, что мне, должно быть, не хватает чего-то основного здесь, но код выше, казалось, был очевидным, и я не смог придумать альтернативу.
В случае, если было бы полезно при написании ответа, вот пример данных, созданных с помощью dput()
, в том же формате, что и поддельные данные, перечисленные выше:
structure(list(ID = 1:20, subj1 = structure(c(3L, NA, 1L, 2L,
2L, 3L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 3L, 3L, 1L, 2L, 1L
), .Label = c("BUS", "ENG", "SCI"), class = "factor"), degree1 = structure(c(2L,
NA, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L), .Label = c("BA", "MN"), class = "factor"), subj2 = structure(c(1L,
2L, NA, NA, 1L, NA, 3L, 2L, NA, 2L, 2L, 1L, 3L, NA, 2L, 1L, 1L,
NA, 2L, 2L), .Label = c("BUS", "ENG", "SCI"), class = "factor"),
degree2 = structure(c(2L, 2L, NA, NA, 2L, NA, 1L, 2L, NA,
2L, 1L, 1L, 2L, NA, 1L, 2L, 2L, NA, 1L, 2L), .Label = c("BA",
"MN"), class = "factor")), .Names = c("ID", "subj1", "degree1",
"subj2", "degree2"), row.names = c(NA, -20L), class = "data.frame")