【发布时间】:2011-05-31 23:03:53
【问题描述】:
我有一个大数据集,但我可以通过一个简单的例子来解释。例如我有一个矩阵“x”
x<- matrix(c(3,3,3,4,3,3,5,5,5), nrow=3, byrow=T)
现在我需要第二行,其中“x”不是唯一条目。第一行和第三行在列的意义上是相等的。
提前致以问候和感谢,
伊夫蒂哈尔·艾哈迈德
【问题讨论】:
我有一个大数据集,但我可以通过一个简单的例子来解释。例如我有一个矩阵“x”
x<- matrix(c(3,3,3,4,3,3,5,5,5), nrow=3, byrow=T)
现在我需要第二行,其中“x”不是唯一条目。第一行和第三行在列的意义上是相等的。
提前致以问候和感谢,
伊夫蒂哈尔·艾哈迈德
【问题讨论】:
您还可以利用相等意味着标准偏差始终为 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
【讨论】:
这是你要找的吗:
x[apply(x,1,FUN=function(r){return(length(unique(r)))}) > 1,]
这将选择其中包含多个唯一值的行。
【讨论】:
x[apply(x, 1, FUN=function(r){length(unique(r))} ) > 1, ] 会稍微短一些,并且会避免在同一行中以两种不同的意义(矩阵和行)使用x