簡體   English   中英

對列求和並在其他列中顯示結果

[英]To sum the columns and display results in other column

這讓我困擾了 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

我嘗試聚合,但他們將其放入另一個表中,我不想再次合並,因為我會丟失信息。

請幫幫我。 提前謝謝你。

這個?

 df %>% 
   count(Account.ID, asset_name) %>% 
   tidyr::pivot_wider( names_from =  asset_name, 
                       values_from = n,
                       values_fill = list(n = 0))
# A tibble: 3 x 5
  Account.ID     A     B     C     D
  <chr>      <int> <int> <int> <int>
1 6yS            1     2     1     0
2 6yU            0     0     0     1
3 876            0     0     1     0

您可以使用dcastdata.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

這是一個tidyverse解決方案,雖然不是最優雅的。

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

我想我有一個答案給你。 所以這是你的數據集:

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

這就是你要找的嗎?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM