【问题标题】:Remove rows that are assoicated to certain columns value删除与某些列值关联的行
【发布时间】:2012-09-17 12:54:29
【问题描述】:

我是 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 列。

谢谢

【问题讨论】:

    标签: r


    【解决方案1】:

    这应该可以解决问题

       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&lt;10会给你一个逻辑向量,这个向量的长度和length(toSum)一样 which(toSum&lt;10)会给你满足条件的元素的位置

    由于您想从dat 中选择那些关联的toSum&lt;10FALSE 的列,那么您必须通过执行dat[, -which(toSum&lt;10)] 将这些列排除在外,这意味着:选择除6 和7 之外的所有列是满足条件的toSum&lt;10

    【讨论】:

    • 感谢您的解释。你能告诉我为什么这段代码不起作用以及我如何使它起作用 cs 的列
    【解决方案2】:

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

    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
    

    【讨论】:

    • 如果列的总和小于 10,我要做的是以下删除 1 的行。在我的示例中,如果添加列,您可以看到 V5 和 V6
    猜你喜欢
    • 2023-02-25
    • 2022-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多