извлечь уникальные строки с условием в r - PullRequest
3 голосов
/ 23 июня 2011

У меня есть такие данные:

x <- matrix(c(2,2,3,3,3,4,4,20,33,2,3,45,6,9,45,454,7,4,6,7,5), nrow = 7, ncol = 3)

В реальном наборе данных у меня огромная матрица с большим количеством столбцов. Я хочу извлечь уникальные строки относительно первого столбца (Id) и минимума третьего столбца. Например, для этой матрицы я бы ожидал

y <- matrix(c(2,3,4,20,3,9,45,4,5), nrow = 3, ncol = 3)

Я много чего пробовал, но не мог понять. Любая помощь приветствуется.

Заранее спасибо, Zeray

Ответы [ 2 ]

5 голосов
/ 23 июня 2011

Вот версия, которая более сложна, но несколько быстрее, чем решение Чейза ddply - примерно в 200 раз быстрее: -)

 uniqueMin <- function(m, idCol = 1L, minCol = ncol(m)) {
    t(vapply(split(1:nrow(m), m[,idCol]), function(i, x, minCol) x[i, , drop=FALSE][which.min(x[i,minCol]),], m[1,], x=m, minCol=minCol))
 }

И следующий тестовый код:

nRows <- 10000
nCols <- 100
ids <- nRows/5
m <- cbind(sample(ids, nRows, T), matrix(runif(nRows*nCols), nRows))
system.time( a<-uniqueMin(m, minCol=3L) ) # 0.07
system.time(ddply(as.data.frame(m), "V1", function(x) x[which.min(x$V3) ,])) # 15.72
2 голосов
/ 23 июня 2011

Вы можете использовать пакет plyr.Преобразуйте в data.frame, чтобы вы могли сгруппировать данные по первому столбцу, а затем с помощью which.min извлечь строку min по группам:

library(plyr)
ddply(as.data.frame(x), "V1", function(x) x[which.min(x$V3) ,])
  V1 V2 V3
1  2 20 45
2  3  3  4
3  4  9  5
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...