6

データ フレーム内の他の 2 つ (またはそれ以上) の変数を条件とする新しい変数をデータ フレーム内に生成しようとしています。R のループ関数 (つまり、lapply、sapply など) は、この目的に役立ち、効率的であると私は信じています。ただし、私のアプローチでは何かが正しくなく、何が原因なのかわかりません。

M <- data.frame(x=c("A", "A", "B", "B"), y=c(1,2,1,2))

x == "A"このデータ フレームを使用して、との両方が TRUE である論理値を含む新しい列 z を生成したいと思いますy == 1。次のコードは、ここで思いつくことができる最高のものですが、最初の条件のみを評価しているようです。

M$z <- sapply(M$x, function(x,y) if((x == "A") && (y == 1)) T else F, M$y)
  • このコードを目的に合わせて修正できますか?
  • おそらく他のループ関数を使用して、Rでこれを行うより良い方法はありますか?
4

2 に答える 2

9

transformこれは関数のタスクです

transform(M, z=ifelse((x == "A") & (y == 1), T, F))
  x y     z
1 A 1  TRUE
2 A 2 FALSE
3 B 1 FALSE
4 B 2 FALSE

もっと簡単なアプローチは次のようになると思います

M$z <- with(M, (x == "A") & (y == 1))
M
  x y     z
1 A 1  TRUE
2 A 2 FALSE
3 B 1 FALSE
4 B 2 FALSE
于 2012-10-25T13:56:58.007 に答える
8

mapply を見てみましょう:

> M$z <- mapply(M$x,M$y, FUN=function(x,y) if((x == "A") && (y == 1)) T else F)
> M
  x y     z
1 A 1  TRUE
2 A 2 FALSE
3 B 1 FALSE
4 B 2 FALSE

当然、これは無名関数とは関係なく、複数の引数を適用することとすべて関係があります。関数に名前を付けた場合でも、単一引数の適用バリアントでは機能しません。

これを行うもう1つの方法はddply、行ごとにするか、data.frameをリストに分割して、各行を個別のエントリにすることです。

于 2012-10-25T13:55:04.763 に答える