Как сделать новые столбцы путем подсчета существующего столбца

77
7

Я хотел бы сделать некоторые другие столбцы, выполнив 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   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

спросил(а) 2021-01-26T00:10:11+03:00 4 месяца, 4 недели назад
1
Решение
63

Мы могли бы gather все значения, затем count их, создать новый столбец, paste 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

ответил(а) 2021-01-26T00:10:11+03:00 4 месяца, 4 недели назад
63

Мы можем просто использовать 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))

ответил(а) 2021-01-26T00:10:11+03:00 4 месяца, 4 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема