【问题标题】:How to select rows which are not unique in columns of matrix in R如何选择R中矩阵列中不唯一的行
【发布时间】:2011-05-31 23:03:53
【问题描述】:

我有一个大数据集,但我可以通过一个简单的例子来解释。例如我有一个矩阵“x”

x<- matrix(c(3,3,3,4,3,3,5,5,5), nrow=3, byrow=T)

现在我需要第二行,其中“x”不是唯一条目。第一行和第三行在列的意义上是相等的。

提前致以问候和感谢,

伊夫蒂哈尔·艾哈迈德

【问题讨论】:

    标签: r matrix


    【解决方案1】:

    您还可以利用相等意味着标准偏差始终为 0 的事实。不幸的是,我们必须使用逻辑表达式(如下)或 as.logical 将这些 0 转换为逻辑。

    x[apply(x, 1, sd) > 0, ]
    

    更新

    对@joran 和我的解决方案进行了一些基准测试。我的丢了:(

    x <- matrix(sample(3:5,30000,T), ncol=3)    
    
    system.time(x2 <- x[apply(x,1,sd) > 0, ])
    user  system elapsed 
    0.960   0.000   0.961
    
    system.time(x2 <- x[apply(x,1,FUN=function(r){return(length(unique(r)))}) > 1,])
    user  system elapsed 
    0.470   0.000   0.465
    

    但是……

    如果我们做一个具有相似主题的完全矢量化版本,我们可以将两者都炸飞

    system.time(x2 <- x[rowSums(abs(x - rowMeans(x))) != 0, ])
    user  system elapsed 
    0.000   0.000   0.001
    

    【讨论】:

    • +1 干得好!不要吹毛求疵之类的,但你的 x 的定义不是创建一个只有一列的矩阵吗?
    【解决方案2】:

    这是你要找的吗:

    x[apply(x,1,FUN=function(r){return(length(unique(r)))}) > 1,]
    

    这将选择其中包含多个唯一值的行。

    【讨论】:

    • +1 虽然x[apply(x, 1, FUN=function(r){length(unique(r))} ) &gt; 1, ] 会稍微短一些,并且会避免在同一行中以两种不同的意义(矩阵和行)使用x
    • @Henry 很好地抓住了双 x;邋遢。函数中明确的“返回”只是我的一个习惯。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多