私はRプログラミングの初心者です。2つの引数を持つ関数を書きたい:
myfunc = function(val,class) { ... }
どこ:
val = c(1,5,10)
class = c("yes","no","no")
関数は、分割点とジニ係数、または分割は不要であるというメッセージを返す必要があります。
分割点は平均です。例えばmean(1, 5) = 3
私はRプログラミングの初心者です。2つの引数を持つ関数を書きたい:
myfunc = function(val,class) { ... }
どこ:
val = c(1,5,10)
class = c("yes","no","no")
関数は、分割点とジニ係数、または分割は不要であるというメッセージを返す必要があります。
分割点は平均です。例えばmean(1, 5) = 3
注:この回答に続くコメントから解釈された関数が更新されました。
次のような関数を作成しようとしているように聞こえますが、あなたの説明では、私はここで暗闇を突き刺しています:
splitting = function(aa, bb) {
out = vector("list", length(bb))
for (i in 1:length(bb)) {
if (bb[i] == "no") {
out[[i]] = "No splitting is required"
} else if (bb[i] == "yes") {
a = c(aa[i], aa[i+1])
b = mean(a)
gini = 1-(aa[i]/sum(a))^2 - (aa[i+1]/sum(a))^2
out[[i]] = paste("The splitting point is", b,
"and the gini is", round(gini, digits=3))
}
}
out
}
いくつかのサンプルデータ:
val = c(1, 5, 10)
class1 = c("yes", "no", "no")
class2 = c("yes", "yes", "no")
サンプル データで関数を実行します。
> splitting(val, class1)
[[1]]
[1] "The splitting point is 3 and the gini is 0.278"
[[2]]
[1] "No splitting is required"
[[3]]
[1] "No splitting is required"
> splitting(val, class2)
[[1]]
[1] "The splitting point is 3 and the gini is 0.278"
[[2]]
[1] "The splitting point is 7.5 and the gini is 0.444"
[[3]]
[1] "No splitting is required"
しかし、予想される「ジニ」がどうあるべきかについて、またはベクトルの最後の要素が「はい」の場合に分割点をどのように処理したいかについて、質問で何も言いません。(この関数は、クラスの最後の要素としてThe splitting point is NA
持っている場合に生成されます。)yes
出力をどのように使用する予定か説明できますか? これはあまりユーザーフレンドリーな形式ではないようです。
このデータは、関数が生成する値にアクセスできる data.frame としてより役立つように思えます。したがって、(Manos がこのデータをどのように使用する予定なのかはわかりません)、関数を次のように変更しました。
splitting = function(aa, bb) {
out = vector("list", length(bb))
for (i in 1:length(bb)) {
if (bb[i] == "no") {
out[[i]] = data.frame(SPLIT.PT = "NA", GINI = "NA")
} else if (bb[i] == "yes") {
a = c(aa[i], aa[i+1])
b = mean(a)
gini = 1-(aa[i]/sum(a))^2 - (aa[i+1]/sum(a))^2
out[[i]] = data.frame(SPLIT.PT = b,
GINI = round(gini, digits=3))
}
}
cbind(VALUE=aa, CLASS=bb, do.call(rbind, out))
}
次のような出力が得られます。
> splitting(val, class1)
VALUE CLASS SPLIT.PT GINI
1 1 yes 3 0.278
2 5 no NA NA
3 10 no NA NA
> splitting(val, class2)
VALUE CLASS SPLIT.PT GINI
1 1 yes 3 0.278
2 5 yes 7.5 0.444
3 10 no NA NA
最小ジニを識別するデータ フレームの後に行を取得するには、行を変更します。
cbind(VALUE=aa, CLASS=bb, do.call(rbind, out))
に:
temp = cbind(VALUE=aa, CLASS=bb, do.call(rbind, out))
mingini = which.min(temp$GINI)
return(list(temp, paste("The splitting point is",
temp$SPLIT.PT[mingini],
"and the gini is",
temp$GINI[mingini],
"( see row", mingini, ")")))
しかし、私の考えでは、これは出力の使いやすさを低下させます。
これで問題が解決した場合は、回答を承認済みとしてマークしてください。