我想创建一个新变量,它的值根据其它变量的取值而定,其中的条件是基于其他仍然存在的变量。这里有一个使用虚假数据的玩具示例。
每一行数据框都代表一个学生。每个学生最多可以修读两门学科(subj1
和subj2
),并且可以在每门学科中追求学位(“BA”)或专业(“MN”)。我的真实数据包括成千上万的学生,几种类型的学位,大约50门学科,以及每个学生最多可以有5个主修/副修。
df <- data.frame(
ID = 1:20,
subj1 = factor(c(
"SCI", NA, "BUS", "ENG", "ENG", "SCI", "ENG", "BUS", "ENG",
"ENG", "BUS", "ENG", "BUS", "BUS", "BUS", "SCI", "SCI", "BUS",
"ENG", "BUS"
)),
degree1 = factor(rep(c("MN", NA, "BA", "MN", "BA"), c(1L, 1L, 3L, 2L, 13L))),
subj2 = factor(c(
"BUS", "ENG", NA, NA, "BUS", NA, "SCI", "ENG", NA, "ENG", "ENG",
"BUS", "SCI", NA, "ENG", "BUS", "BUS", NA, "ENG", "ENG"
)),
degree2 = factor(c(
"MN", "MN", NA, NA, "MN", NA, "BA", "MN", NA, "MN", "BA", "BA",
"MN", NA, "BA", "MN", "MN", NA, "BA", "MN"
))
)
df
#> ID subj1 degree1 subj2 degree2
#> 1 1 SCI MN BUS MN
#> 2 2 <NA> <NA> ENG MN
#> 3 3 BUS BA <NA> <NA>
#> 4 4 ENG BA <NA> <NA>
#> 5 5 ENG BA BUS MN
#> 6 6 SCI MN <NA> <NA>
#> 7 7 ENG MN SCI BA
#> 8 8 BUS BA ENG MN
#> 9 9 ENG BA <NA> <NA>
#> 10 10 ENG BA ENG MN
#> 11 11 BUS BA ENG BA
#> 12 12 ENG BA BUS BA
#> 13 13 BUS BA SCI MN
#> 14 14 BUS BA <NA> <NA>
#> 15 15 BUS BA ENG BA
#> 16 16 SCI BA BUS MN
#> 17 17 SCI BA BUS MN
#> 18 18 BUS BA <NA> <NA>
#> 19 19 ENG BA ENG BA
#> 20 20 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,则无法使用向量化赋值。
我觉得我可能漏掉了一些基本的东西,但是上面的代码似乎是显而易见的事情,我也想不出其他的替代方案。