2014-11-19 1 views
1

У меня есть список событий с координатами (x, y), где x составляет от 1 до 100 и y от 1 до 86. Существует (часто много) дубликатов каждой координаты. Я хочу заполнить матрицу (эффективно сетку чисел) с подсчетами каждой координаты. Как мне это сделать?R: Нужно заполнить матрицу подсчетами координат (из фрейма данных со списком координат, некоторые из которых являются дубликатами)

Прямо сейчас, моя лучшая попытка:

s=matrix(data=NA,nrow=n,ncol=k) 
for(i in 1:n){ 
    for(j in 1:k){ 
    s[i,j]=nrow(subset(data,x_column==i & y_column==j)) 
    } 
} 

Это работает для небольших (~ 10000 строк) кадров данных, но я хотел бы, чтобы запустить его для кадра данных с почти 3 миллиона строк, и мой метод слишком медленный.

Edit (данные):

n=86;k=100; 
x_column y_column 
54   30 
51   32 
65   34 
19   46 
51   27 
45   60 
62   31 
64   45 
16   69 
31   33 

Спасибо, ребята!

Редактировать: ну, оказывается, программа была достаточно быстрой для моих нужд - мое рабочее пространство было просто увязло с множеством данных, и это замедляло все, что я пытался сделать. Поэтому мой метод работает, но хорошо знать альтернативные способы заполнения матрицы. Я загрузил первые 10 строк; может кто-то сделать тест скорости?

+0

Было бы хорошо, если бы вы добавили пример набора данных, так что мы можем просто попытаться и скорость-тест. Как правило, вы хотели бы использовать семейство функций 'apply',' sapply' вместо циклов 'for'. В качестве альтернативы, вы можете даже распараллелить его, если у вас есть несколько ядер, используя 'foreach' – OganM

+0

, как я должен загружать/форматировать данные? просто скопировать/вставить? У меня есть набор данных, который я сокращаю до 100 строк. – Colin

+0

копия пасты первых нескольких строк всегда помогает – OganM

ответ

3

Вот один подход, использующий data.table и матрицы пакетов:

library(data.table) 
library(Matrix) 

f <- function(df, nx, ny) { 
    ## Tally up the frequencies 
    dt <- data.table(df, key=c("x", "y")) 
    xyN <- dt[, .N, by=key(dt)] 
    ## Place counts in matrix in their respective i/j x/y row/column 
    as.matrix(with(xyN, sparseMatrix(i=x,j=y,x=N,dims=c(nx,ny)))) 
} 

## Check that it works: 
df <- data.frame(x=c(2,2,2,3,3,3), y=c(1,1,1,1,2,2)) 
f(df, nx=4, ny=4) 
#  [,1] [,2] [,3] [,4] 
# [1,] 0 0 0 0 
# [2,] 3 0 0 0 
# [3,] 1 2 0 0 
# [4,] 0 0 0 0 

## Speed test with 3 million coordinates 
df <- data.frame(x=sample(1:100, 3e6,replace=T), y=sample(1:86, 3e6, replace=T)) 
system.time(res <- f(df, nx=100, ny=86)) 
# user system elapsed 
# 0.16 0.03 0.19 
sum(res) 
# [1] 3e+06 

Если вы можете гарантировать, что вы будете иметь, по крайней мере некоторые координаты в каждой возможной строке и столбце, вы можете просто использовать базовый R-х table() (хотя это не так быстро):

df <- data.frame(x=sample(1:100, 3e6,replace=T), y=sample(1:86, 3e6, replace=T)) 
system.time(res2 <- as.matrix(table(df))) 
# user system elapsed 
# 2.67 0.07 2.74 
sum(res2) 
# [1] 3000000 
+0

Спасибо, Джош! Я определенно буду использовать это в будущем. – Colin

Смежные вопросы