さらに他の変数の値を条件として、他の 2 つの変数のいずれかの値と等しい新しい変数を作成したいと考えています。これは、偽のデータを使用したおもちゃの例です。
データ フレームの各行は生徒を表します。各学生は、最大 2 つの科目 (subj1
およびsubj2
) を学習することができ、各科目で学位 (「BA」) または副専攻 (「MN」) を取得することができます。私の実際のデータには、数千人の学生、数種類の学位、約 50 の科目が含まれており、学生は最大 5 つの専攻/副専攻を持つことができます。
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
...
次に、6 番目の変数 を作成します。この変数は、 ifが学生の主要な専攻である場合、またはifの値が主要な専攻である場合df$major
に等しくなります。主要な専攻は、「BA」に等しい学位を持つ最初の科目です。次のコードを試しました:subj1
subj1
subj2
subj2
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
これは、割り当てが少なくとも 1 つの行で 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")