错误:(下标)逻辑下标太长

时间:2012-09-18 15:00:45

标签: r

有人可以告诉我为什么我会收到此错误以及如何解决此问题?

这是代码

我想要做的是删除与1相关的行,如果该列的列少于10

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)]

由于

1 个答案:

答案 0 :(得分:2)

如果我理解你想要达到的目的,你最好用这种方式写出来:

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

这意味着:对于总和小于10的任何列(以下称为“小列”),请删除该列中包含1的任何行。因此,您只保留所有这些小列中具有零的行。你也可以删除小列,因为它们在任何情况下都只包含零。

在您的代码中,indx是一个包含40行的逻辑数据框,每行输入一行,输入中每个小列一列。您使用idx的第一列删除第一个短列中的1行。这会导致dat新值,这比原始行短几行。在循环的下一次迭代中,您将使用第二个逻辑向量来尝试删除更多行。 但是这不起作用:在第一次迭代后,dat少于40行,但第二列仍然有40行。这就是导致错误的原因:您正在使用长度为40的逻辑向量订阅少于40个元素的向量。

您可以使用以下表达式将indx的三列合并为一个适合下标感兴趣行的矢量:

apply(indx, 1, all)

对于每列中TRUE的行,其结果中将显示TRUE值。但是,我想我更喜欢上面的代码,因为写入时要短得多。最喜欢后者的最可能的原因是,如果您的数据框可能包含负数,那么行的总和为零并不意味着全零行。在您的示例数据中没有问题。