【问题标题】:R: return array index of partial string matchR:返回部分字符串匹配的数组索引
【发布时间】:2016-05-15 20:16:10
【问题描述】:

假设我有一个由 1:100 填充的 10x10 矩阵。我想搜索所有以“0”结尾的数字,并且我想要它们的[i,j] 索引号。我尝试了which(..., arr.ind=T),但找不到适用于它的函数。我也试过grep('0$', ...),但它只返回矩阵的单个索引作为向量。我想可以把这个数字变成二进制索引,但是有没有更简单的方法?

x <- t(matrix(1:100,nrow=10,ncol=10))
#  Output:
#  [1,]  1  10
#  [2,]  2  10
#  ...
#  [10,] 10 10

【问题讨论】:

    标签: arrays r indexing match


    【解决方案1】:

    我们可以将grepl 输出转换为matrix 与原始'x' 相同的dim,然后使用whicharr.ind=TRUE

    which(`dim<-`(grepl('0$', x), dim(x)), arr.ind=TRUE)
    #       row col
    # [1,]   1  10
    # [2,]   2  10
    # [3,]   3  10
    # [4,]   4  10
    # [5,]   5  10
    # [6,]   6  10
    # [7,]   7  10
    # [8,]   8  10
    # [9,]   9  10
    #[10,]  10  10
    

    或者不改变dim,我们得到grepl输出为logical向量,取反(!)使TRUE变为FALSE,FALSE为TRUE,与原矩阵相乘得到输出在matrix。这也会将 'x' 中以 '0' 结尾的值替换为 0。然后再次取反 (!),以便 0 转换为 TRUE,所有其他值转换为 FALSE。使用which,我们就得到了TRUE值对应的索引。

    which(!x*(!(grepl('0$', x))), arr.ind=TRUE)
    

    【讨论】:

    • 你能解释一下为什么我必须添加反引号来获得 ``dim(grepl('0$', x), dim(x)) 以产生正确的结果吗?我对它们的使用不是很熟悉。
    • @dasf 我更新了输出。像 dim&lt;-names&lt;- 这样的一些函数可以这样分配。另一种选择是明确指定为dim(output) &lt;- dim(x)(但我们必须多写一行)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-23
    • 1970-01-01
    • 2012-12-30
    • 2021-07-15
    相关资源
    最近更新 更多