Суммирование столбцов и отображение результатов в другом столбце - PullRequest
0 голосов
/ 03 марта 2020

Это меня беспокоит с 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 ]

3 голосов
/ 03 марта 2020

Вы можете использовать dcast из data.table с аргументом fun.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
3 голосов
/ 03 марта 2020

Этот?

 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
1 голос
/ 03 марта 2020

Вот решение по принципу 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
0 голосов
/ 03 марта 2020

Я думаю, у меня есть ответ для вас. Итак, это ваш набор данных:

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

Это то, что вы искали?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...