Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将年份数据框转换为R中的类别计数数据框_R - Fatal编程技术网

将年份数据框转换为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