删除与某些列值关联的行

时间:2012-09-17 12:54:30

标签: r

我是R的新手,我有0和1的X矩阵并且与y相关联作为数据。 我需要删除少于10个的观察结果,所以我添加x的列,然后将列名称返回到向量。然后删除与那个相关联的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列。

由于

2 个答案:

答案 0 :(得分: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<10将为您提供逻辑向量,此向量的长度与length(toSum)相同 which(toSum<10)将为您提供符合条件的元素的位置

由于您要从dat中选择关联的toSum<10FALSE的列,因此您必须通过执行dat[, -which(toSum<10)]将这些列排除在外,这意味着:选择了除了6和7之外的所有列,这些列符合条件toSum<10

答案 1 :(得分:0)

使用您的示例数据,如果您想查找哪些行(即观察值)少于10 1 s

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

rscs都是逻辑变量,可用于索引以删除行/列。

要摆脱我们使用的列:

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