如何在R中融合或重塑分箱数据?

时间:2015-08-12 21:25:43

标签: r aggregate reshape melt

我有反映各大洲河流宽度的数据。下面是一个示例数据集。我只是想把数据放到我展示的表格中。

 dat <- read.table(text =    
                      "width continent bin
                      5.32     Africa  10
                      6.38     Africa  10
                      10.80    Asia    20
                      9.45     Africa  10
                      22.66    Africa  30
                      9.45     Asia    10",header = TRUE)

如何融化上述玩具数据集以创建此数据框?

Bin Count Continent
10  3     Africa
10  1     Asia
20  1     Asia
30  1     Africa

2 个答案:

答案 0 :(得分:5)

我们可以按组使用其中一个聚合。

data.table选项是转换&#39; data.frame&#39;到&#39; data.table&#39; (setDT(dat)),按&#39;大陆&#39;分组和&#39; bin&#39;变量,我们得到每组元素的数量(。N

library(data.table)
setDT(dat)[,list(Count=.N) ,.(continent,bin)]
#    continent bin Count
#1:    Africa  10     3
#2:      Asia  20     1
#3:    Africa  30     1
#4:      Asia  10     1

dplyr的类似选项,可以对变量进行分组,然后使用n()代替.N来获取计数。

 library(dplyr)
 dat %>%
      group_by(continent, bin) %>%
      summarise(Count=n())

或者我们可以使用aggregate中的base R并使用公式方法获取length

 aggregate(cbind(Count=width)~., dat, FUN=length)
 #   continent bin Count
 #1    Africa  10     3
 #2      Asia  10     1
 #3      Asia  20     1
 #4    Africa  30     1

来自@ Frank&s和@David Arenburg的评论,使用data.tabledplyr的其他一些选项。我们将数据集转换为data.tablesetDT(dat)),转换为&#39; wide&#39;格式为dcast,然后将其重新格式化为“长”字样。使用melt,并对roww(value>0

进行子集化
 library(data.table)
 melt(dcast(setDT(dat),continent~bin))[value>0]

使用count

中的dplyr
 library(dplyr)
 count(dat, bin, continent)

答案 1 :(得分:2)

使用sqldf

library(sqldf)
sqldf("SELECT bin, continent, COUNT(continent) AS count 
      FROM dat 
      GROUP BY bin, continent")

输出:

  bin continent count
1  10    Africa     3
2  10      Asia     1
3  20      Asia     1
4  30    Africa     1