Преобразование между длинными и короткими форматами data.frame - PullRequest
0 голосов
/ 02 июля 2018

Простой (?) tidyr вопрос:

У меня есть data.frame, в котором есть несколько столбцов группировки и несколько столбцов значений в длинном формате. Я хочу преобразовать его в короткий (широкий) формат, где key будет одним из столбцов группировки, а результирующий data.frame будет иметь столбец для каждой комбинации всех других столбцов группировки и каждого из столбцов значений.

Вот мой длинный формат data.frame:

set.seed(1)
library(dplyr)
df <- data.frame(treatment = rep(c(rep("T1",3),rep("T2",3)),2),
                 species = c(rep("S1",6),rep("S2",6)),
                 group = rep(LETTERS[1:3],4),
                 n = as.integer(runif(12,10,20))) %>%
  dplyr::group_by(treatment,species) %>% dplyr::mutate(freq = n/sum(n))

И вот что я хочу получить в результате широкоформатного data.frame:

res.df <- data.frame(group = LETTERS[1:3],
                     T1.S1.n = dplyr::filter(df,treatment == "T1",species == "S1")$n,
                     T1.S1.freq = dplyr::filter(df,treatment == "T1",species == "S1")$freq,
                     T2.S1.n = dplyr::filter(df,treatment == "T2",species == "S1")$n,
                     T2.S1.freq = dplyr::filter(df,treatment == "T2",species == "S1")$freq,
                     T1.S2.n = dplyr::filter(df,treatment == "T1",species == "S2")$n,
                     T1.S2.freq = dplyr::filter(df,treatment == "T1",species == "S2")$freq,
                     T2.S2.n = dplyr::filter(df,treatment == "T2",species == "S2")$n,
                     T2.S2.freq = dplyr::filter(df,treatment == "T2",species == "S2")$freq)

1 Ответ

0 голосов
/ 02 июля 2018

Мы можем использовать gather для преобразования в «длинный» формат, затем unite столбцы вместе и spread в «широкий»

library(tidyverse)
gather(df, key, val, n:freq) %>% 
     unite(trtsp, treatment, species, key, sep = ".") %>%
     spread(trtsp, val)
...