R 从长到宽,带计数和求和

R Long to wide with count and sum

我有如下数据:

#dt
Method   ID     Source     Amt
A         1          X      10
A         1          Y      20
C         1          Z      30
B         2          Y      15
D         2          Z      10
C         3          X      20
D         3          X      20
E         4          Z      10
E         4          Z      10

我想要的是:

ID    Total_Amt     Method_A     Method_B     Method_C     Method_D     Method_E     Source_X     Source_Y     Source_Z 
1            60            2            0            1            0            0            1            1            1
2            25            0            1            0            1            0            0            1            1
3            40            0            0            1            1            0            2            0            0
4            20            0            0            0            0            2            0            0            2

对于 MethodSource 列,我想通过它们的 ID 计算计数并使用 dcast 转换为宽格式并添加 AmtID.

有帮助吗?

这是使用 dplyrtidyr 库的一种方法。我们首先为每个 ID 计算 Amt 个值的 sum,获取长格式的数据,count 行数并以宽格式获取数据。

library(dplyr)  
library(tidyr)

df %>%
  group_by(ID) %>%
  mutate(Amt = sum(Amt)) %>%
  pivot_longer(cols = c(Method, Source)) %>%
  count(ID, value, Amt, name) %>%
  pivot_wider(names_from = c(name, value), values_from = n, values_fill = 0)


#     ID   Amt Method_A Method_C Source_X Source_Y Source_Z Method_B Method_D Method_E
#  <int> <int>    <int>    <int>    <int>    <int>    <int>    <int>    <int>    <int>
#1     1    60        2        1        1        1        1        0        0        0
#2     2    25        0        0        0        1        1        1        1        0
#3     3    40        0        1        2        0        0        0        1        0
#4     4    20        0        0        0        0        2        0        0        2