0

次の内容のデータ フレームがあるとします。

Trial Person 
1     John   
2     John   
3     John   
4     John
1     Bill 
2     Bill
3     Bill
4     Bill

これを次のように変換したい

Trial Person Day
1     John   1
2     John   1
3     John   2
4     John   2
1     Bill   1
2     Bill   1
3     Bill   2
4     Bill   2

とても簡単に作れます

Trial Person Day
1     John   TRUE
2     John   TRUE
3     John   FALSE
4     John   FALSE
1     Bill   TRUE
2     Bill   TRUE
3     Bill   FALSE
4     Bill   FALSE

d$day=d$trial<3しかし、どうすれば欲しいものを手に入れることができますか?

4

4 に答える 4

1

より一般的には、フォームのベクトルを に変換しようとしている場合、1 日に 2 回の試行があるかのようc(1,2,3,4,5,6)c(1,1,2,2,3,3)、整数除算を使用してこれを表現することができます。

> x <- 1:6
> x
[1] 1 2 3 4 5 6
> (x-1) %/% 2 + 1
[1] 1 1 2 2 3 3
于 2010-02-12T20:21:20.137 に答える
1

割り当てを明示的にしたい場合 (および 3 のカットオフをハードコーディングしたい場合)、次を使用できます。

d$Day <- ifelse(d$trial<3, 1, 2)

これはもう少し透明です。そうしないと、あなたが発見したように、算術演算を行うと論理値が数値に変換されます。as.numericまたはを使用して、自分で行うことができますas.integer

as.integer(FALSE)  #0
as.integer(TRUE)   #1
于 2010-02-12T20:04:55.810 に答える
1

データを取得します。

x <- read.table(textConnection(
"Trial Person 
1     John   
2     John   
3     John   
4     John
1     Bill 
2     Bill
3     Bill
4     Bill"), header=TRUE)

あなたの現在のアプローチは正しいものだと思います(注:この場合、加算を行うときに自動的にキャストされるため、as.numericは必要ありません):

(x$Trial >= 3) + 1

それ以外の場合は、plyr を使用してそれを行う方法があります。

library(plyr)
ddply(x, .(Person), transform, Day=rep(c(1,2), each=2))
于 2010-02-12T20:11:06.820 に答える
0

わかりましたので、解決策を見つけました。

(d$trial>=3)+1

ブール値を整数に変換して機能します...しかし、これを行うより良い方法はありますか?

于 2010-02-12T19:59:30.763 に答える