在R中的多个列上聚合table()而没有“by”细分

时间:2011-09-11 16:09:45

标签: r dataframe aggregate

我有一个x和y坐标点的2列数据框。我想生成一个表中每个点的出现次数。使用table()命令为所有可能的x-y对生成一个表。我可以用

消除额外内容
fullTable <- table(coords)
smalLTable <- subset(fullTable, fullTable > 0)

然后我确信我可以用dimnames(fullTable)做一些事来获得合适的坐标,但是有更好的方法吗?内置的东西?与

有关的东西
coords <- data.frame(x = c(1, 1, 2, 2, 3, 3), y = c(1, 1, 2, 1, 1, 1))

将返回

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

5 个答案:

答案 0 :(得分:9)

只使用Vanilla R,你可以做到

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

答案 1 :(得分:7)

优于ddply count

library(plyr)
count(coords)

对于稀疏的2d结果,它比表快得多。

答案 2 :(得分:4)

您可以使用ddply库中的plyr

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

答案 3 :(得分:4)

您也可以使用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

有关使用.N和使用data.table

创建频率表的详细信息,请参阅this answer

答案 4 :(得分:1)

添加dplyr方法:

library(dplyr)
group_by(coords, x, y) %>%
  summarize(count = n())