2011-09-11 13 views
5

Posiadam dwukolumnową ramkę danych z współrzędnymi X i Y punktów. Chcę wygenerować tabelę z liczbą wystąpień każdego punktu. Użycie polecenia table() powoduje utworzenie tabeli dla wszystkich możliwych par x-y. Mogę wyeliminować dodatki zTabela agregująca() na wiele kolumn w R bez podziału "by"

fullTable <- table(coords) 
smalLTable <- subset(fullTable, fullTable > 0) 

I wtedy na pewno mógłby zrobić trochę coś z dimnames(fullTable) aby uzyskać odpowiednie współrzędne, ale tam jest lepszy sposób? Coś wbudowanego? Coś, co z

coords <- data.frame(x = c(1, 1, 2, 2, 3, 3), y = c(1, 1, 2, 1, 1, 1)) 

wróci

x y count 
1 1 2 
2 1 1 
2 2 1 
3 1 2 

Odpowiedz

9

Korzystanie tylko Vanilla R, można zrobić

aggregate(rep(1, nrow(coords)), by = list(x = coords$x, y = coords$y), sum) 
+0

Dokładnie to, co ja szukałem. Dzięki! – Gregor

+1

'coords' to data.frame (które już jest listą), więc nieco krótszym rozwiązaniem byłoby:' aggregate (coords $ x, by = coords, length) '. –

4

Można użyć ddply z biblioteki plyr

plyr::ddply(coords, .(x, y), summarize, count = length(x)) 
7

B etter niż ddply znaczy count:

library(plyr) 
count(coords) 

To dużo szybciej niż tabeli dla nielicznych 2d wyników zbyt.

4

Można również użyć data.table

library(data.table) 
DT <- data.table(coords) 
DT[,.N,by=list(x,y)] 
## x y N 
## 1: 1 1 2 
## 2: 2 2 1 
## 3: 2 1 1 
## 4: 3 1 2 

Zobacz this answer więcej szczegółów na temat stosowania .N i tworzenia tabel częstotliwości z data.table

1

Dodawanie dplyr metody:

library(dplyr) 
group_by(coords, x, y) %>% 
    summarize(count = n()) 
Powiązane problemy