0

私はRプログラミングの初心者です。2つの引数を持つ関数を書きたい:

myfunc = function(val,class) { ... }

どこ:

val = c(1,5,10) 
class = c("yes","no","no")

関数は、分割点とジニ係数、または分割は不要であるというメッセージを返す必要があります。

分割点は平均です。例えばmean(1, 5) = 3

4

1 に答える 1

1

注:この回答に続くコメントから解釈された関数が更新されました。

次のような関数を作成しようとしているように聞こえますが、あなたの説明では、私はここで暗闇を突き刺しています:

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 として出力するための変更された関数

このデータは、関数が生成する値にアクセスできる 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, ")")))

しかし、私の考えでは、これは出力の使いやすさを低下させます。

これで問題が解決した場合は、回答を承認済みとしてマークしてください。

于 2012-04-24T10:30:11.653 に答える