如何在 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.table
和 dplyr
的一些附加选项。我们将数据集转换为 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
我对反映每个大陆河流宽度的数据进行了分类。下面是一个示例数据集。我几乎只想将数据转换成我显示的形式。
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.table
和 dplyr
的一些附加选项。我们将数据集转换为 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