用分类变量从长到宽的 R 整形

tma*_*ako 1 r dplyr tidyr

我有一个如下所示的数据框,带有年份和 ID 标识符,以及许多分类变量(下面用大写字母表示的值):

Year   ID   Var1   Var2  Var3 ...

1996   1    A      A     B
1996   1    A      A     C
1996   2    B      A     D
1998   2    C      C     A
2000   3    D      D     D
Run Code Online (Sandbox Code Playgroud)

我的目标是通过 ID 将其重塑为宽格式,同时还提供 ID、年份和价值的计数。因此,例如:

ID    Var1_1996_A  Var1_1996_B  Var1_1996_C   Var1_1996_D ...

1     2            0            0             0
2     0            1            0             0
3     0            0            0             0
Run Code Online (Sandbox Code Playgroud)

依此类推,对于每个变量。我对 R 比较陌生,无法从现有帖子中找到类似的操作(如果这是重复的,请道歉)。有谁知道实现这一目标的最佳方法是什么?我试过使用tidyr::pivot_wider,但只能弄清楚如何附加年份,但不能为每个变量响应创建单独的类别

df <- df %>%
    pivot_wider(names_from = year,
                values_from (Var1, Var2, Var3, Var4, Var5)
Run Code Online (Sandbox Code Playgroud)

如果有人能提供一些见解,将不胜感激。

Ron*_*hah 5

首先获取长格式数据:

library(tidyr)

df %>%
  pivot_longer(cols = starts_with('Var')) %>%
  pivot_wider(names_from = c(name, Year, value), values_from = name, 
              values_fn = length, values_fill = 0)

#     ID Var1_1996_A Var2_1996_A Var3_1996_B Var3_1996_C Var1_1996_B Var3_1996_D
#  <int>       <int>       <int>       <int>       <int>       <int>       <int>
#1     1           2           2           1           1           0           0
#2     2           0           1           0           0           1           1
#3     3           0           0           0           0           0           0
# … with 6 more variables: Var1_1998_C <int>, Var2_1998_C <int>,
#   Var3_1998_A <int>, Var1_2000_D <int>, Var2_2000_D <int>, Var3_2000_D <int>
Run Code Online (Sandbox Code Playgroud)

数据

df <- structure(list(Year = c(1996L, 1996L, 1996L, 1998L, 2000L), ID = c(1L, 
1L, 2L, 2L, 3L), Var1 = c("A", "A", "B", "C", "D"), Var2 = c("A", 
"A", "A", "C", "D"), Var3 = c("B", "C", "D", "A", "D")), 
class = "data.frame", row.names = c(NA, -5L))
Run Code Online (Sandbox Code Playgroud)