Как преобразовать мой фрейм данных в столбцы строк? - PullRequest
0 голосов
/ 12 февраля 2020

У меня есть фрейм данных с двумя столбцами «Тип» и «Статистика». Я хочу, чтобы у каждого типа была одна строка со всей статистикой в ​​отдельном столбце. Например, мой фрейм данных выглядит примерно так:

Column Type has values: A A A A B B B B
Column Stats has values:15 2 73 12 12 6 52 17  

И я хочу, чтобы он выглядел следующим образом:

Column Type has values: A B
Column Stat1 has values: 15 12
Column Stat2 has values: 2 6
Column Stat3 has values: 73 52
Column Stat4 has values: 12 17

Не все типы имеют одинаковое количество характеристик, некоторые типы отсутствует значение стат и другие имеют доп. Я пытался использовать t (), но столкнулся с проблемами. Затем я попытался объединить все значения Stat в один столбец и разделить их gsub() и csplit(), но у меня были проблемы с объединением всех значений Stat для каждого типа в один столбец. Любой совет?

1 Ответ

1 голос
/ 12 февраля 2020

Мы можем использовать pivot_wider после создания столбца последовательности, сгруппированного по типу

library(dplyr)
library(tidyr)
df1 %>%
   group_by(Type) %>%
   mutate(rn = str_c('Stats_', row_number())) %>%
   ungroup %>%
   pivot_wider(names_from = rn, values_from = Stats)
# A tibble: 2 x 5
#  Type  Stats_1 Stats_2 Stats_3 Stats_4
#  <fct>   <dbl>   <dbl>   <dbl>   <dbl>
#1 A          15       2      73      12
#2 B          12       6      52      17

Или используя dcast из data.table

library(data.table)
dcast(setDT(df1), Type ~ paste0("Stats_", rowid(Type)),  value.var = 'Stats')

Или, как @Onyambu предложил в base R, это можно сделать с помощью reshape

reshape(transform(df1, time = ave(Stats, Type,
           FUN = seq_along)), dir="wide", idvar = "Type", sep = "_")

data

df1 <- data.frame(Type = rep(c("A", "B"), each = 4), 
         Stats = c(15, 2, 73, 12, 12, 6, 52, 17))
...