Переход от длинного к широкому с помощью pivot_wider от tidyr

#r #tidyr

#r #tidyr

Вопрос:

У меня есть простой long df, где каждый элемент в столбце fi должен быть новым столбцом в широком df. Таким образом, новый df должен содержать 10 столбцов A: J. В широком df должно быть две строки: «одна» и «две».

Звучит как задание для pivot_wider, но я не смог заставить его работать.

 library("tidyverse")

df <- structure(list(fi = c("A", "B", "C", "D", "E", "F", "G", "H", 
                            "I", "J"), one = c(0.5, 1.4, 0.89, 1.4, 1.45, 1.25, 1.45, 1.4, 
                                               1.4, 1.5), two = c(0.75, 1.6, 1.05, 1.6, 1.45, 1.05, 1.65, 1.5, 
                                                                  1.55, 1.65)), row.names = c(NA, -10L), class = c("tbl_df", "tbl", 
                                                                                                                   "data.frame"))
df

# Not it
df %>% 
  pivot_wider(names_from = fi, values_from = c(one, two))
 

Ответ №1:

Сначала получите данные в формате long, чтобы значения one и two были в одном столбце, а затем преобразуйте их в формат wide.

 library(tidyr)

df %>%
  pivot_longer(cols = -fi) %>%
  pivot_wider(names_from = fi, values_from = value)

# name      A     B     C     D     E     F     G     H     I     J
#  <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 one    0.5    1.4  0.89   1.4  1.45  1.25  1.45   1.4  1.4   1.5 
#2 two    0.75   1.6  1.05   1.6  1.45  1.05  1.65   1.5  1.55  1.65
 

С data.table :

 library(data.table)
setDT(df)
dcast(melt(df, id.vars = 'fi'), variable ~fi, value.var = 'value')
 

Ответ №2:

Мы можем использовать recast

 library(reshape2)
recast(df, id.var = 'fi', variable ~ fi)
 

-вывод

 #  variable    A   B    C   D    E    F    G   H    I    J
#1      one 0.50 1.4 0.89 1.4 1.45 1.25 1.45 1.4 1.40 1.50
#2      two 0.75 1.6 1.05 1.6 1.45 1.05 1.65 1.5 1.55 1.65