Как сделать новые столбцы путем подсчета существующего столбца - PullRequest
0 голосов
/ 04 февраля 2019

Я хотел бы создать некоторые другие столбцы, выполнив group_by в R.

Когда исходная таблица будет такой, как показано ниже

 userID   cat1    cat2
    a        f       3
    a        f       3
    a        u       1
    a        m       1
    b        u       2
    b        m       1
    b        m       2

Я группирую их по userID и хочу, чтобы они выглядели как

userID   cat1_f  cat1_m  cat1_u  cat2_1  cat2_2  cat2_3
a        2       1       1       2       0       1
b        0       2       1       1       2       0

Ответы [ 2 ]

0 голосов
/ 04 февраля 2019

Мы можем просто использовать table из base R

table(df)
#       cat1
#userID f m u
#     a 2 1 1
#     b 0 2 1

Или с dcast из data.table

library(data.table)
dcast(setDT(df), userID ~ paste0('cat1_', cat1))

данные

df <- structure(list(userID = c("a", "a", "a", "a", "b", "b", "b"), 
cat1 = c("f", "f", "u", "m", "u", "m", "m")), class = "data.frame", 
 row.names = c(NA, -7L))
0 голосов
/ 04 февраля 2019

Мы могли бы gather все значения, затем count их, создать новый столбец, используя значения paste ing cat и value, а затем spread вернуть его в широкоформатный формат с помощью fill=0.

library(tidyverse)

df %>%
  gather(cat, value, -userID) %>%
  count(userID, cat, value) %>%
  unite(cat, c(cat, value)) %>%
  spread(cat, n, fill = 0)

#  userID cat1_f cat1_m cat1_u cat2_1 cat2_2 cat2_3
#  <fct>   <dbl>  <dbl>  <dbl>  <dbl>  <dbl>  <dbl>
#1  a          2      1      1      2      0      2
#2  b          0      2      1      1      2      0
...