Как выбрать строки, которые не являются уникальными в столбцах матрицы в R - PullRequest
1 голос
/ 01 июня 2011

У меня большой набор данных, но я могу объяснить на простом примере.Например, у меня есть матрица "x"

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

Теперь мне нужна вторая строка, в которой "x" не является уникальными записями.Первая и третья строки равны в смысле столбцов.

С уважением и заранее спасибо,

Ифтихар Ахмад

Ответы [ 2 ]

7 голосов
/ 01 июня 2011

Вы также можете воспользоваться тем фактом, что равенство означает, что стандартное отклонение всегда будет равно 0. К сожалению, мы должны преобразовать эти 0 в логические либо с помощью логического выражения (ниже), либо с помощью as.logical.

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
6 голосов
/ 01 июня 2011

Это то, что вы ищете:

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

, который выберет строки, содержащие более одного уникального значения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...