1

私はRを初めて使用します。0と1のXマトリックスがあり、データとしてyに関連付けられています。10 個未満の観測を削除する必要があるため、x の列を追加し、列名をベクトルに返します。次に、1 に関連付けられている y を削除します。次に、列を削除する必要があります。これは、ゼロの列になるためです。したがって、このエラーが発生し、コードを修正して改善する方法がわかりません -Col[i] のエラー: 単項演算子の引数が無効です

ここにコードがあります

a0=rep(1,40)
a=rep(0:1,20)
b=c(rep(1,20),rep(0,20))
c0=c(rep(0,12),rep(1,28))
c1=c(rep(1,5),rep(0,35))
c2=c(rep(1,8),rep(0,32))
c3=c(rep(1,23),rep(0,17))
x=matrix(cbind(a0,a,b,c0,c1,c2,c3),nrow=40,ncol=7)
nam <- paste("V",1:7,sep="")
colnames(x)<-nam
dat <- cbind(y=rnorm(40,50,7),x)
#===================================
toSum <- apply(dat,2,sum)
Col <- Val <- NULL
for(i in 1:length(toSum)){
if(toSum[i]<10){
Col <- c(Col,colnames(dat)[i])
Val <- c(Val,toSum[i])}
}

for(i in 1:length(Col)){
indx <- dat[,Col[i]]==0
datnw <- dat[indx,]
datnw2 <- datnw[,-Col[i]]
}

誰か助けてくれませんか?Col ベクトルの列の位置を取得する方法があるかどうかはわかりません。元のデータには約 1500 列あります。

ありがとう

4

2 に答える 2

0

これでうまくいくはずです

   datnw2 <- dat[, -which(toSum<10)]

これにより、ループを回避できます

 head(datnw2)
            y V1 V2 V3 V4 V7
[1,] 60.88166  1  0  1  0  1
[2,] 54.35388  1  1  1  0  1
[3,] 39.78881  1  0  1  0  1
[4,] 44.20074  1  1  1  0  1
[5,] 42.27351  1  0  1  0  1
[6,] 43.52390  1  1  1  0  1

編集:いくつかのポインタ

toSum<10length(toSum) which(toSum<10)論理ベクトルを提供します。このベクトルの長さは、条件を満たす要素の位置を提供するものと同じです

dat関連するtoSum<10がである列を選択したいので、 を実行してそれらの列を除外するFALSE必要がありますdat[, -which(toSum<10)]。つまり、条件を満たす列である 6 と 7 以外のすべての列を選択します。toSum<10

于 2012-09-17T13:06:20.200 に答える
0

1サンプル データを使用して、10秒未満の行 (つまり、観測) を見つけたい場合

rs <- rowSums(dat[, -1]) < 10

どの列 (つまり、変数) の「プレゼンス」が 10 未満かを知りたい場合は、

cs <- colSums(dat[, -1]) < 10

R> cs
   V1    V2    V3    V4    V5    V6    V7 
FALSE FALSE FALSE FALSE  TRUE  TRUE FALSE

rsとはどちらも、cs行/列を削除するためのインデックス付けに使用できる論理変数です。

使用する列を削除するには:

dat2 <- dat
dat2 <- dat2[, !cs]
head(dat2)

R> head(dat2)
            y V1 V2 V3 V6 V7
[1,] 47.61253  1  0  1  1  1
[2,] 60.51697  1  1  1  1  1
[3,] 53.69815  1  0  1  1  1
[4,] 53.79534  1  1  1  1  1
[5,] 49.04329  1  0  1  1  1
[6,] 42.04286  1  1  1  1  1

次に、一部の行がすべてゼロになることを懸念しているようですか? それが最後のステップでやろうとしていることですか?ここではそうではないようです。おそらく、私が示している列を削除する方法または削除することで、その問題も解決しましたか?

R> rowSums(dat2[,-1])
 [1] 4 5 4 5 4 5 4 5 3 4 3 4 3 4 3 4 3 4 3 4 2 3 2 2 1 2 1 2 1 2 1 2 1 2 1 2 1 2
[39] 1 2
于 2012-09-17T13:23:41.650 に答える