私は、各行がスタディの参加者を表すデータフレーム(dat)を持っています。各参加者(「コード」)には、性別(「性別」)と年齢(「年齢」)、テスト結果を示す列(「v.1」など)を示す列があります。データフレームは、このようなものになります。テスト結果の各列に対して同じmapply関数を使用して複数の新しい変数を作成する
> dat
code sex age v.1 v.2
1 A1 m 8 4 9
2 B2 f 12 7 2
を、私は8のデータフレーム(例えば「v.1.m.8」の外に対応するベクトルの値をルックアップする必要があります12歳の女性参加者の場合は「v.1.f.12」)、そのベクトルの値をデータフレームの新しい列(「v.1.t」)に挿入します。男性と女性の参加者と異なる年齢層の異なるベクトルがあります。ベクトルはこのような何かを見て:私にとって
v.1.m.8 <- c(4, 5, 2, 8, 2, ...)
v.2.m.8 <- c(3, 2, 2, 1, 8, ...)
v.1.m.12 <- c(...)
v.2.m.12 <- c(...)
v.1.f.8 <- c(...)
v.2.f.8 <- c(...)
v.1.f.12 <- c(...)
v.2.f.12 <- c(...)
を、ベクトル内の値を検索するための最も論理的に簡単な方法は、場合-statemenst forループnestesです。ソートまたは、このように:
for (i in nrow(dat)) {
if (dat[i, ]$age < 8 | dat[i, ]$age > 18) {
dat[i, ]$v.1.t <- NA
dat[i, ]$v.2.t <- NA
} else if (dat[i, ]$age < 12) {
if (dat[i, ]$dat.sex == "m") {
dat[i, ]$v.1.t <- v.1.m.8[dat[i, ]$v.1]
dat[i, ]$v.2.t <- v.2.m.8[dat[i, ]$v.2]
} else {
dat[i, ]$v.1.t <- v.1.f.8[dat[i, ]$v.1]
dat[i, ]$v.2.t <- v.2.f.8[dat[i, ]$v.2]
}
} else {
if (dat[i, ]$dat.sex == "m") {
dat[i, ]$v.1.t <- v.1.m.12[dat[i, ]$v.1]
dat[i, ]$v.2.t <- v.2.m.12[dat[i, ]$v.2]
} else {
dat[i, ]$v.1.t <- v.1.f.12[dat[i, ]$v.1]
dat[i, ]$v.2.t <- v.2.f.12[dat[i, ]$v.2]
}
}
}
ループを回避するために、私は(mapply使用する場合があります)この方法のようなもので:
dat$v.1.t <- mapply(
function(a, b, c) {
if (a < 8 | a > 18) {
NA
} else if (a < 12) {
if (b == "m") {
v.1.m.8[c]
} else {
v.1.f.8[c]
}
} else {
if (b == "m") {
v.1.m.12[c]
} else {
v.1.f.12[c]
}
}
},
dat$age,
dat$dat.sex,
dat$v.1
)
dat$v.2.t <- mapply(
function(a, b, c) {
if (a < 8 | a > 18) {
NA
} else if (a < 12) {
if (b == "m") {
v.2.m.8[c]
} else {
v.2.f.8[c]
}
} else {
if (b == "m") {
v.2.m.12[c]
} else {
v.2.f.12[c]
}
}
},
dat$age,
dat$dat.sex,
dat$v.2
)
この第二の解決策の問題は、私が繰り返さなければならないということです私が割り当てたい各変数の全コード。
もっと良い解決策はありますか?
実際のコードでは、11個の新しい列を作成するために44個のベクトルで11個の列を検索する必要があります。
私は
外部ベクターとの比較はどのように行うべきですか?同様に、そのベクトルのどの値をデータセットの新しい変数に書き込む必要があるかを決定する方法は? 'テスト結果の列ごとに、データフレームの外の対応するベクトルの値を調べる必要があります(たとえば、8歳の男性参加者の場合は「v.1.m.8」、または「v.1.f.12」の場合) 12歳の女性参加者)、そのベクトルの値をデータフレームの新しい列( "v.1.t")に挿入します。これらの名前はベクトルで、データの値をベクトルを選択し、対応する値を選択しますか? @LeoP。 – LAP
"v.1.m.8"はベクトルの1つの名前です。 dat $ v.1.tの値は、このベクトルのdat $ v.1の値の位置にある値です。例えば。 'dat $ v.1.t < - v.1.m.8 [dat $ v.1]'です。どのベクトルが選択されるかは、参加者の年齢および性別によって決まります。たとえば、ベクトル「v.1.m.8」には、12歳未満の男性参加者の値が含まれています。 –