将年份数据框转换为R中的类别计数数据框
我有一个数据框架,如以下示例所示:将年份数据框转换为R中的类别计数数据框,r,R,我有一个数据框架,如以下示例所示: set.seed(661) raw <- data.frame( year = 1900:2020, cat = sample(c("A", "B", "C", "D", "E"), size = 121, replace = TRUE) ) head(raw) year cat 1 1900 B 2 1901 A 3 1
set.seed(661)
raw <- data.frame(
year = 1900:2020,
cat = sample(c("A", "B", "C", "D", "E"), size = 121, replace = TRUE)
)
head(raw)
year cat
1 1900 B
2 1901 A
3 1902 E
4 1903 E
5 1904 B
6 1905 A
我尝试了以下代码片段:
test <- raw %>%
group_by(cat) %>%
transmute(year = year,
count = seq(n())
)
test%
分组依据(类别)%>%
转化(年=年,
计数=序号(n())
)
但这并没有让我看到每年的每个类别
我还考虑每年为每个类别创建一系列广泛格式的二进制变量(即当raw$cat==“B”
然后raw$catB==1
和raw$catA==0
等等),然后对其进行重塑,但不确定这是否是最有效的解决方案
我更喜欢用base R来解决这个问题,但我也希望能用dplyr来解决
非常感谢 使用
complete
创建每年的每个cat
值,对于每个cat
获取累计计数总和
library(dplyr)
library(tidyr)
raw %>%
mutate(count = 1) %>%
complete(year, cat, fill = list(count = 0)) %>%
group_by(cat) %>%
mutate(count = cumsum(count)) %>%
ungroup
# A tibble: 605 x 3
# year cat count
# <int> <chr> <dbl>
# 1 1900 A 0
# 2 1900 B 1
# 3 1900 C 0
# 4 1900 D 0
# 5 1900 E 0
# 6 1901 A 1
# 7 1901 B 1
# 8 1901 C 0
# 9 1901 D 0
#10 1901 E 0
# … with 595 more rows
库(dplyr)
图书馆(tidyr)
原始%>%
突变(计数=1)%>%
完成(年份、类别、填充=列表(计数=0))%>%
分组依据(类别)%>%
突变(计数=总和(计数))%>%
解组
#一个tibble:605x3
#年份猫数
#
#1 1900 A 0
#2 1900 B 1
#3 1900 C 0
#4 1900 D 0
#5 1900 E 0
#6 1901 A 1
#7 1901 B 1
#8 1901 c0
#9 1901 D 0
#10 1901 E 0
#…还有595行
在base R中,您可以通过以下方式执行此操作:
dat <- expand.grid(year = unique(raw$year), cat = unique(raw$cat))
raw$count <- 1
dat1 <- merge(dat, raw, all.x = TRUE)
dat1$count[is.na(dat1$count)] <- 0
dat1 <- transform(dat1, count = ave(count, cat, FUN = cumsum))
dat这使用了base R、折叠包和magrittr(管道的最后一个)
在下面的代码中,我们首先使用xtabs
获得一个计数表,按cat
和year
(每行是一年,每列是一个类别)。然后,我们计算给出另一个表对象的列的累积和。接下来,使用as.data.frame
的表格方法将其转换为长格式数据框,重新排列列的顺序,并按照问题中所示的相同顺序对它们进行排序。如果行和列的顺序不重要,则可以省略最后两行代码
library(collapse)
library(magrittr)
raw %>%
xtabs(~ year + cat, .) %>%
dapply(cumsum) %>%
as.data.frame %>%
fselect(year, cat, count = Freq) %>%
roworder(year, cat)
结果的前几行是
year cat count
1 1900 A 0
2 1900 B 1
3 1900 C 0
4 1900 D 0
5 1900 E 0
6 1901 A 1
7 1901 B 1
8 1901 C 0
9 1901 D 0
10 1901 E 0
11 1902 A 1
12 1902 B 1
在raw
dataframe中,每年只有一个值。如何在desiredFinal
中获得重复年份?在desiredFinal
中,每年的多个值用于原始$cat
中的每个唯一值。由于raw$cat
每年只有一个观察值,因此raw$cat
的每一个其他值都有一种忽略的观察值。因此,desiredFinal$count
等于所有前几年raw$cat
每个值的累计观察计数。
year cat count
1 1900 A 0
2 1900 B 1
3 1900 C 0
4 1900 D 0
5 1900 E 0
6 1901 A 1
7 1901 B 1
8 1901 C 0
9 1901 D 0
10 1901 E 0
11 1902 A 1
12 1902 B 1