5

2 列のすべての行の値を長さ 2 のベクトルに置き換えようとしています。表示する方が簡単です。

まずここにいくつかのデータがあります。

set.seed(1234) 
x<-data.frame(x=sample(c(0:3), 10, replace=T))
x$ab<-0 #column that will be replaced
x$cd<-0 #column that will be replaced

データは次のようになります。

   x ab cd
1  0  0  0
2  2  0  0
3  2  0  0
4  2  0  0
5  3  0  0
6  2  0  0
7  0  0  0
8  0  0  0
9  2  0  0
10 2  0  0

x=2 または x=3 のたびに、ab=0 および cd=1 にしたい。

私の試みはこれです:

x[with(x, which(x==2|x==3)), c(2:3)] <- c(0,1)

意図した結果が得られない:

   x ab cd
1  0  0  0
2  2  0  1
3  2  1  0
4  2  0  1
5  3  1  0
6  2  0  1
7  0  0  0
8  0  0  0
9  2  1  0
10 2  0  1

手伝って頂けますか?

4

6 に答える 6

8

希望どおりに機能しない理由は、R が行列と配列を列優先のレイアウトで格納するためです。また、短い配列を長い配列に割り当てると、R は短い配列を循環します。たとえば、

x<-rep(0,20)
x[1:10]<-c(2,3)

その後、あなたは

 [1] 2 3 2 3 2 3 2 3 2 3 0 0 0 0 0 0 0 0 0 0

あなたの場合、 x が 2 または 3 に等しいサブ配列が vector を循環することによって列方向に埋められているということc(0,1)です。この動作を変更する簡単な方法がわかりません。

ここで行う最も簡単な方法は、一度に 1 列ずつ入力することです。または、次のようなこともできます。

indices<-with(x, which(x==2|x==3))
x[indices,c(2,3)]<-rep(c(0,1),each=length(indices))
于 2013-09-24T16:39:11.153 に答える
2

複数列と複数値の一般化:

mycol<-as.list(names(x)[-1])
myvalue<-as.list(c(0,1))
kk<-Map(function(y,z) list(x[x[,1] %in% c(2,3),y]<-z,x),mycol, myvalue)
myresult<-data.frame(kk[[2]][[2]])


x ab cd
1  1  0  0
2  1  0  0
3  0  0  0
4  0  0  0
5  0  0  0
6  3  0  1
7  2  0  1
8  3  0  1
9  3  0  1
10 0  0  0
于 2013-09-24T16:46:14.623 に答える
0

そのことについて何?

 x[x$x%in%c(2,3),c(2,3)]=matrix(rep(c(0,1),sum(x$x%in%c(2,3))),ncol=2,byrow=TRUE)
于 2013-09-24T17:28:56.743 に答える