4

私は以下のようなデータで非常に些細な質問があります:

sample<-list(c(10,12,17,7,9,10),c(NA,NA,NA,10,12,13),c(1,1,1,0,0,0))
sample<-as.data.frame(sample)
colnames(sample)<-c("x1","x2","D")

>sample
x1  x2  D
10  NA  1
12  NA  1
17  NA  1
7   10  0
9   20  0
10  13  0

注:D=1の観測数はD=0と同じです

ここで、 whenに関連する値とwhenにx3関連する値を持つ変数を作成します。期待される出力:D=0D=1D=1D=0

x1  x2  D   x3
10  NA  1   10
12  NA  1   20
17  NA  1   13
7   10  0   NA
9   20  0   NA
10  13  0   NA

ifelse次のように関数を使ってみました。

sample.data$x3<-with(sample.data, ifelse(D==1,x2[which(D==0)],x2[which(D==1)]))

次のエラーが発生しました:

logical(0)

私も次のことを試しました:

sample.data$x3<-with(sample.data, ifelse(D==1,tail(x2,3),head(x2,3)))

繰り返しますが、同じエラーが発生しました。

logical(0)

ここで何が起こっているのか分かりますか?

4

2 に答える 2

5

ご存知ですかdata.table、これで解決策があります...

install.packages("data.table")
library(data.table)

sample = as.data.table(sample)
sample[,x4:=ifelse(D==1,x2[D==0],x2[D==1])]
于 2013-03-15T18:33:40.250 に答える
4

コマンドのロジックは適切ですが、データフレームを正しく参照していません。コード行全体で.dataafterを削除するだけです。sampleしたがって、このコマンドは必要なものを提供します。

sample$x3<-with(sample,ifelse(D==1,x2[which(D==0)],x2[which(D==1)]))

ただし、そのコードはまだ少し冗長です。

@Arun がコメントで指摘したようにx2、結果として使用する値を選択するときに which() 関数を含める必要はありませんifelse。次のコードでは、同じ結果が得られます。

sample$x3<-with(sample,ifelse(D==1,x2[D==0],x2[D==1]))
于 2013-03-15T18:16:24.253 に答える