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

Jas*_*ney 1 aggregate r 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)
Run Code Online (Sandbox Code Playgroud)

如何融合上述玩具数据集来创建此数据框?

Bin Count Continent
10  3     Africa
10  1     Asia
20  1     Asia
30  1     Africa
Run Code Online (Sandbox Code Playgroud)

akr*_*run 5

我们可以使用组中的任何一个聚合.

data.table办法是对"data.frame"转换为"data.table"( setDT(dat)),由"大陆"和"本"的变量,我们可以得到每个组元素的数量进行分组(. 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
Run Code Online (Sandbox Code Playgroud)

或者类似的选项,dplyr通过对变量进行分组然后使用n()而不是.N获取计数.

 library(dplyr)
 dat %>%
      group_by(continent, bin) %>%
      summarise(Count=n())
Run Code Online (Sandbox Code Playgroud)

或者我们可以使用aggregatebase 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
Run Code Online (Sandbox Code Playgroud)

来自@ Frank's和@David Arenburg的评论,使用data.table和的一些其他选项dplyr.我们将数据集转换为data.table(setDT(dat)),转换为'wide'格式dcast,然后将其重新转换为'long'使用melt,并将roww(value>0)子集化

 library(data.table)
 melt(dcast(setDT(dat),continent~bin))[value>0]
Run Code Online (Sandbox Code Playgroud)

使用count来自dplyr

 library(dplyr)
 count(dat, bin, continent)
Run Code Online (Sandbox Code Playgroud)