我有反映各大洲河流宽度的数据。下面是一个示例数据集。我只是想把数据放到我展示的表格中。
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
答案 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.table
和dplyr
的其他一些选项。我们将数据集转换为data.table
(setDT(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