1

誰かが私にこのエラーが発生する理由とその修正方法を教えてもらえますか?

これがコードです

私がやろうとしているのは、1の列が10未満の場合、1に関連付けられている行を削除することです。

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))
c4=c(rep(1,6),rep(0,34))
x=matrix(cbind(a0,a,b,c0,c1,c2,c3,c4),nrow=40,ncol=8)
nam <- paste("V",2:9,sep="")
colnames(x)<-nam
dat <- cbind(y=rnorm(40,50,7),x)
#===================================
toSum <- colSums(dat)
Col <- Val <- NULL
for(i in 1:length(toSum)){
if(toSum[i]<10){
Col <- c(Col,colnames(dat)[i])
Val <- c(Val,toSum[i])}
}
cs <- colSums(dat) < 10
indx <- dat[,which(cs)]==0
for(i in 1:dim(indx)[2]){
datnw <- dat[indx[,i],]
dat <- datnw}
datnw2 <- dat[, -which(cs)]

ありがとう

4

1 に答える 1

2

私があなたが達成しようとしていることを正しく理解しているなら、あなたはそれをこのように書くのが最善かもしれません:

cs <- colSums(dat) < 10
dat[rowSums(dat[,cs]) == 0, !cs]

つまり、合計が10未満の列(以降「小さな列」と呼びます)の場合、その列に1が含まれる行をすべて削除します。したがって、これらすべての小さな列にゼロがある行のみを保持します。いずれの場合もゼロしか含まれないため、小さな列も削除します。

コードでindxは、は40行の論理データフレームであり、入力の各行に1つ、入力の小さな列ごとに1つの列があります。の最初の列を使用してidx、最初の短い列に1が含まれる行を削除します。これにより、の新しい値が生成されますdat。これは、元の値よりも数行短くなります。ループの次の反復では、2番目の論理ベクトルを使用して、さらに行を削除しようとします。ただし、これは機能しません。最初の反復後、dat40行未満ですが、2番目の列にはまだ40行すべてがあります。これがエラーの原因です。40要素未満のベクトルを長さ40の論理ベクトルで添え字化しています。

indx次の式を使用して、目的の行に添え字を付けるのに適した単一のベクトルに、の3つの列を組み合わせることができます。

apply(indx, 1, all)

これは、各列にTRUEある行とまったく同じ結果に値を持ちます。TRUEただし、書くのがはるかに短いので、これよりも上記のコードの方が好きだと思います。後者を好む最も可能性の高い理由は、データフレームに負の数が含まれている可能性があるため、行の合計がゼロであることはすべてゼロの行を意味しない場合です。サンプルデータでは問題ありません。

于 2012-09-18T15:11:34.770 に答える