汇总列并在其他列中显示结果

时间:2020-03-03 14:13:29

标签: r sum aggregate data-manipulation

这从2天开始困扰着我。

我有类似

的数据
   Account.ID asset_name
      6yS        A
      6yS        B
      6yS        B
      6yS        C
      6yU        D
      876        C

在这里,我想制作更多类似假人的栏目。但是我每个ID只需要一行。

我的输出应该像这样

   Account.ID asset_name  Flag_A  Flag_B  Flag_C  Flag_D
     6yS          A           1      2      1       0     
     6yU          D           0      0      0       1
     876          C           0      0      1       0

我尝试进行汇总,但是它们将其放入另一个表中,我不想再次合并,因为我将丢失信息。

请帮帮我。 预先感谢您。

4 个答案:

答案 0 :(得分:3)

这个吗?

[Route]

答案 1 :(得分:3)

您可以将dcast中的data.tablefun.aggregate参数一起使用:

library(data.table)

dcast(data = setDT(df)[, asset_name := paste0('Flag_', asset_name)], 
      formula = Account.ID ~ asset_name, 
      fun.aggregate = length)

输出:

   Account.ID Flag_A Flag_B Flag_C Flag_D
1:        6yS      1      2      1      0
2:        6yU      0      0      0      1
3:        876      0      0      1      0

答案 2 :(得分:1)

这不是最优雅的解决方法。

Account.ID <- c('6yS', '6yS', '6yS', '6yS', '6yU', '876')
asset_name <- c('A','B','B','C','D','C')
df <- data.frame(Account.ID, asset_name)

df <- df %>%
  group_by(Account.ID, asset_name) %>%
  summarise(Count = n()) %>%
  spread(key = asset_name, value = Count, fill = 0)

返回:

  Account.ID     A     B     C     D
  <fct>      <dbl> <dbl> <dbl> <dbl>
1 6yS            1     2     1     0
2 6yU            0     0     0     1
3 876            0     0     1     0

答案 3 :(得分:0)

我想我有一个答案。这是您的数据集:

Account.ID <- c("6yS", "6yS", "6yS", "6yS", "6yU", 876)
asset_name <- c("A", "B", "B", "C", "D", "C")

df <- data.frame(Account.ID, asset_name)
df

  Account.ID asset_name
1        6yS          A
2        6yS          B
3        6yS          B
4        6yS          C
5        6yU          D
6        876          C

对于进一步的转换,我正在使用tidyverse,因此请安装并加载库:

install.packages("tidyverse")
library(tidyverse)

df <-df %>% 
  group_by(Account.ID, asset_name) %>%
  summarize(n=n()) %>%
  spread(asset_name, n)
df

# A tibble: 3 x 5
# Groups:   Account.ID [3]
  Account.ID     A     B     C     D
  <fct>      <int> <int> <int> <int>
1 6yS            1     2     1    NA
2 6yU           NA    NA    NA     1
3 876           NA    NA     1    NA

现在所需要做的就是将NA设置为0并重命名列:

df[is.na(df)] <- 0

names(df)[2:ncol(df)] <- paste0("Flag_", names(df)[2:ncol(df)]) 
df

# A tibble: 3 x 5
# Groups:   Account.ID [3]
  Account.ID Flag_A Flag_B Flag_C Flag_D
  <fct>       <dbl>  <dbl>  <dbl>  <dbl>
1 6yS             1      2      1      0
2 6yU             0      0      0      1
3 876             0      0      1      0

这是您要找的吗?