【问题标题】:Row Index where one column has a non-zero entry一列具有非零条目的行索引
【发布时间】:2018-05-22 10:13:23
【问题描述】:

我认为这可能是一个重复的问题,但我找不到答案,所以就这样吧。如果我有一个矩阵 X:

 > X
       [,1] [,2] [,3] [,4] [,5]
  [1,]   1    4   55    1    8
  [2,]  48    2    0    1    2
  [3,]  67   23   53   55   78
  [4,]   0   78    0    0    0
  [5,]  85   91   23   65   83

在一个条目非零而所有其他条目为零的情况下,获取行索引的最简单方法是什么?我试过了:

test <- which(X[,2] != 0 & X[,-2] == 0)

理想情况下,我希望结果是:4。但是,事实并非如此......我知道which() 给了我索引(行和列)所以它可能不是解决这个问题的方法...... . 有什么想法吗?

提前致谢!

【问题讨论】:

    标签: r indexing row


    【解决方案1】:
    X <- as.matrix(read.table(text="
     1    4   55    1    8
    48    2    0    1    2
    67   23   53   55   78
     0   78    0    0    0
    85   91   23   65   83"))
    
    which(rowSums(X!=0)==1)
    # [1] 4
    

    这里有 2 种方法可以纠正您的方法,请注意,它们专注于观察第 2 列,而我的解决方案没有:

    which(X[,2] != 0 & rowSums(X[,-2] != 0)==0) # [1] 4
    which(X[,2] & !apply(X[,-2],1,any,0))       # [1] 4
    

    您的方法失败了,因为X[,-2] == 0 是一个布尔矩阵,而不是您想要的向量。

    如果您想分别为所有列执行此操作,您可以使用lapply

    lapply(seq(ncol(X)),function(i) which(X[,i] != 0 & rowSums(X[,-i] != 0)==0))
    

    【讨论】:

    • 这适用于这个特定的例子。但是,我真正的问题更棘手,因为我有一个包含许多行和 19 列的大矩阵(2GB),我想找出有多少行的第一列有非零条目,所有剩余列的条目为零.. . 然后对所有其他 18 列执行相同的操作。但感谢您的意见!
    • 检查我的更新以纠正您的方法,并采用第一个(使用 rowSums),因为它会更快。将2 替换为1
    • 试试这个:lapply(seq(ncol(X)),function(i) which(X[,i] != 0 &amp; rowSums(X[,-i] != 0)==0))。如果这不能提供您想要的输出,请更新您的问题,这不是一个很难解决的问题,但我不确定您想要哪种输出格式。
    • 使用lapply 的最后一个解决方案完美运行!非常感谢
    【解决方案2】:

    试试这个简单的示例代码:

        m<-as.matrix(cbind(a=c(1,1,1,0,0,1),b=c(1,1,1,1,0,0),c=c(1,1,1,0,0,0)))
    > m
         a b c
    [1,] 1 1 1
    [2,] 1 1 1
    [3,] 1 1 1
    [4,] 0 1 0
    [5,] 0 0 0
    [6,] 1 0 0
    > 
    > #Row detection
    > which(rowSums(m!=0)==1)
    [1] 4 6
    > 
    > #Column with elemnte !=0
    > apply(m[which(rowSums(m!=0)==1),],1,which.max)
    [1] 2 1
    

    【讨论】:

    • 如前所述,这适用于这个特定的示例。但是,我真正的问题更棘手,因为我有一个包含许多行和 19 列的大矩阵(2GB),我想找出有多少行的第一列有非零条目,所有剩余列的条目为零.. . 然后对所有其他 18 列执行相同的操作。但感谢您的意见!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-01-05
    • 1970-01-01
    • 1970-01-01
    • 2016-10-14
    • 1970-01-01
    • 2018-11-27
    • 1970-01-01
    相关资源
    最近更新 更多