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

How do I melt or reshape binned data in R?

我对反映每个大陆河流宽度的数据进行了分类。下面是一个示例数据集。我几乎只想将数据转换成我显示的形式。

 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

我们可以按组使用任一聚合。

data.table 选项是将 'data.frame' 转换为 'data.table' (setDT(dat)),按 'continent' 和 'bin' 变量分组,我们得到每组的元素数 (.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())

或者我们可以使用 base R 中的 aggregate 并使用公式方法,我们得到 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 和@David Arenburg 的评论,使用 data.tabledplyr 的一些附加选项。我们将数据集转换为 data.table (setDT(dat)),使用 dcast 转换为 'wide' 格式,然后使用 melt 将其重新转换回 'long',并对 roww (value>0)

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

使用 dplyr

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

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