Как я могу конвертировать из широкого в длинный, используя две строки для ключа и значения в сборке tidyverse? - PullRequest
0 голосов
/ 26 марта 2020

Я пытаюсь преобразовать свои данные из широкой в ​​длинную с помощью команды gather tidyverse (я бы предпочел избегать плавления / приведения). Однако в моих данных есть две совпадающие строки, которые я хочу использовать при преобразовании.

 `2018 Data`  Codes   `Code1`  `Code2`   `Code3`           
1 ID          Names Code1Name Code2Name Code3Name 
2 1110        Crop…      0         0         0                       
3 1120        Anim…      0         0         0                       
4 1131        Timb…      0         0         0                                    

Вы заметите, что данные странные в том, что есть две строки с именами переменных, но вторая строка рассматривается как первая строка наблюдений. Коды и кодовые имена совпадают, но я не нашел способа сделать правильную команду сбора, которая соответствует им. В настоящее время у меня есть что-то вроде df_tall<-gather(df_wide, key="Codes", value="CodeValue") Однако, это не соответствует именам должным образом.

Ниже приведены идеальные данные, которые я хочу получить:

ID                    Names             Codes    CodeValue
1 1110        Crop…   Code1Name         Code1     0                          
2 1110        Crop…   Code2Name         Code2     0                         
3 1110        Crop…   Code3Name         Code3     0                        

Есть идеи, как мне этого добиться?

На StackOverflow не хватает вопросов для конвертации из широкого в длинный, но мне не повезло найти такой же вопрос (поправьте меня, если я что-то пропустил).

1 Ответ

0 голосов
/ 26 марта 2020

Попробуйте:

DF <- data.frame(`2018 Data` = c("ID","1110","1120","1131"),
           Codes = c("Names","Crop..","Anim..","Timb.."),
           `Code1` = c("Code1Name","0","0","0"),
           `Code2` = c("Code2Name","0","0","0"),
           `Code3` = c("Code3Name","0","0","0"))

names(DF) <- unname(unlist(DF[1,]))

DF %>%
  filter(ID != "ID") %>%
  pivot_longer(starts_with("Code"), names_to = "Codes", values_to = "Value") %>%
  mutate(Code = sub("Name","",Codes)) %>%
  select(ID, Names, Codes, Code, Value) %>%
  as.data.frame()

Результат

    ID  Names     Codes  Code Value
1 1110 Crop.. Code1Name Code1     0
2 1110 Crop.. Code2Name Code2     0
3 1110 Crop.. Code3Name Code3     0
4 1120 Anim.. Code1Name Code1     0
5 1120 Anim.. Code2Name Code2     0
6 1120 Anim.. Code3Name Code3     0
7 1131 Timb.. Code1Name Code1     0
8 1131 Timb.. Code2Name Code2     0
9 1131 Timb.. Code3Name Code3     0

PS: gather() функция удалена, используйте pivot_longer() вместо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...