Я хочу создать новую переменную, которая равна значению одной из двух других переменных, при условии значения других переменных. Вот пример игрушки с поддельными данными.Условное присвоение одной переменной значению одной из двух других переменных
Каждая строка кадра данных представляет студента. Каждый студент может изучать до двух предметов (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")
Есть строки, в которых оба degree1 и являются BA степени 2. Каким должен быть главный столбец в этих случаях? –
Если deg1 = "BA", то subj1 является основным основным. Если deg1! = "BA" & deg2 == "BA", то subj2 является основным основным. С точки зрения проблемы, с которой я столкнулся, конкретные условия для выбора основного основного не так важны, как причина неудачи этого метода назначения. – eipi10