0

データフレームの各行に関数を適用しようとしています。この関数は、引数としてcharsとnumsの組み合わせを使用します。

これは集計の演習ではありませんが、char変数とnum変数の両方を使用する一連の条件に基づいた、既存のdata.frame内の新しいフィールドの定義です。すべての変数はdata.frameにあります。

関数がデータフレーム行をベクトル(この場合はcharベクトル)に変換することを知っていapplyます。関数内でデータフレーム変数を再キャストすることは避けたいと思います。

data.frame行全体で関数を実行するためapplyの使用方法とパッケージに関する投稿がいくつかありますが、私の初心者の観点からは、例では行ごとにcharパラメーターとnumパラメーターを混在させていません。plyrありがとう。

condsIdx <- function(IDa,IDb,clss){
  if (clss == 'a'){
    y = IDa
  } else if (clss == 'b' && IDb > 14) {
    y = IDb
  } else {
    y = -1
  }
  y
}

df <- data.frame( IDa=c(1,2,3,4,5,6),
                  IDb=c(11,12,13,14,15,16),
                  clss=c('a','a','a','b','b','c'))


df$res <- -1
for ( i in 1:nrow(df) ){
  df$res[i] <- condsIdx(df$IDa[i],df$IDb[i],df$clss[i])
}
4

2 に答える 2

3

mapplyまたは同等のplyrを使用してくださいmlply

mapply(condsIdx,IDa = df$IDa,IDb = df$IDb,clss = df$clss)
[1]  1  2  3 -1 15 -1
于 2013-03-11T21:09:38.680 に答える
3

ここを使用ifelseして、ベクトル化されたソリューションを取得できます。

transform(df, res =  ifelse (clss == 'a', 
                             IDa,
                             ifelse(clss == 'b' & IDb > 14,IDb,  -1)))


  IDa IDb clss res
1   1  11    a   1
2   2  12    a   2
3   3  13    a   3
4   4  14    b  -1
5   5  15    b  15
6   6  16    c  -1

タイプミスの編集&&はベクトル化されていないので、&に置き換えます。(@ joranに感謝)

于 2013-03-11T21:11:07.450 に答える