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)
我们可以使用组中的任何一个聚合.
该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)
或者我们可以使用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
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)