如何选择R中矩阵列中不唯一的行

发布于 2024-11-10 18:31:59 字数 210 浏览 4 评论 0原文

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

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

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

提前致以问候和感谢,

Iftikhar Ahmad

I have a big data set but i can explain through a simple example. For example i have a matrix "x"

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

now i need second row in which "x" is not unique entries. First and third rows are equal in the sense of columns.

Regards and thanks in advance,

Iftikhar Ahmad

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

腻橙味 2024-11-17 18:31:59

您还可以利用这样一个事实:相等意味着标准差始终为 0。不幸的是,我们必须使用逻辑表达式(如下)或使用 as.logic 将这些 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

You could also take advantage of the fact that equality means the standard deviation will always be 0. unfortunately we have to convert these 0s to logical either with a logical expression (below) or with as.logical.

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

Update

Did some benchmarking of @joran and my solutions. Mine lost :(

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

But...

If we do a fully vectorised version with a similar theme, we can blow both out of the water

system.time(x2 <- x[rowSums(abs(x - rowMeans(x))) != 0, ])
user  system elapsed 
0.000   0.000   0.001
荒人说梦 2024-11-17 18:31:59

这就是您正在寻找的内容吗:

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

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

Is this what you're looking for:

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

that will select rows with more than one unique value in them.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文