#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