Поворот шире в R

#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, они пробовали?