#r #tidyverse
#r #tidyverse
Вопрос:
У меня есть фрейм данных, подобный этому
rest_id task_name quarter nc
123 labeling 1 TRUE
123 labeling 2 FALSE
123 labeling 3 FALSE
123 labeling 4 FALSE
123 cooking 1 TRUE
123 cooking 2 FALSE
123 cooking 3 TRUE
123 cooking 4 FALSE
123 cleaning 1 TRUE
123 cleaning 2 FALSE
123 cleaning 3 TRUE
123 cleaning 4 FALSE
Я хочу повернуть его так, чтобы он выглядел следующим образом
rest_id quarter labeling cooking cleaning
123 1 TRUE TRUE TRUE
123 2 FALSE FALSE FALSE
123 3 FALSE TRUE TRUE
123 4 FALSE FALSE FALSE
Я пробовал это:
X <- pivot_wider(df,
names_from = task_name,
values_from = nc,
values_fill = list(nc=F))
Но это не дает мне желаемого результата .. кто-нибудь может мне помочь?
Комментарии:
1. Я не смог воспроизвести проблему. Даже при создании этого имени столбца ‘task_name’ в виде вектора, у меня это работает, потому что функция сначала ищет объект в непосредственной среде, то есть сами данные, а не родительскую среду, то есть .GlobalEnv.
2. Основан ли он на тех же данных, с которыми у вас возникла проблема. Можете ли вы попробовать данные из моего поста. Было бы лучше использовать
dput
, чтобы структура стала понятной для воспроизводимости. Кроме того, когда вы говорите, что это не дает ожидаемого результата. Какой результат вы получаете
Ответ №1:
Нам не нужно создавать вектор имен столбцов для широкого формата. names_from
Выполняется выбор из столбца ‘task_name’ в наборе данных, и создается широкое имя столбца на основе уникальных значений этого столбца
library(dplyr)
library(tidyr)
df %>%
pivot_wider(names_from = task_name, values_from = nc,
values_fill = list(nc = FALSE))
# A tibble: 4 x 5
# rest_id quarter labeling cooking cleaning
# <int> <int> <lgl> <lgl> <lgl>
#1 123 1 TRUE TRUE TRUE
#2 123 2 FALSE FALSE FALSE
#3 123 3 FALSE TRUE TRUE
#4 123 4 FALSE FALSE FALSE
данные
df <- structure(list(rest_id = c(123L, 123L, 123L, 123L, 123L, 123L,
123L, 123L, 123L, 123L, 123L, 123L), task_name = c("labeling",
"labeling", "labeling", "labeling", "cooking", "cooking", "cooking",
"cooking", "cleaning", "cleaning", "cleaning", "cleaning"), quarter = c(1L,
2L, 3L, 4L, 1L, 2L, 3L, 4L, 1L, 2L, 3L, 4L), nc = c(TRUE, FALSE,
FALSE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE, TRUE, FALSE
)), class = "data.frame", row.names = c(NA, -12L))
Комментарии:
1. Разве это не тот же самый код, который, по словам OP, они пробовали?