R: Преобразовать набор данных с помощью справочного файла - PullRequest
1 голос
/ 03 мая 2019

Не совсем точно, как сформулировать то, что я ищу, но у меня есть основной набор данных (1000 строк) и другой файл данных (1000 строк). Это отношение один ко многим, и я хочу присоединиться к таблице, но вместо нескольких строк основного набора данных я хотел бы создать столбцы на основе столбца в файле сведений.

Ниже приведен пример того, что я ищу:

> maindata <- data.frame(ID = c(1,2,3,4), Customer = c("Bob","Mary","Bill","Steve"), stringsAsFactors = FALSE)
> maindata
  ID Customer
  1      Bob
  2     Mary
  3     Bill
  4    Steve

> reference <- data.frame(ID = c(1,1,1,1,2,2,4), Code = c("Credit","Price","Cust","Task","Credit","Task","Cust"), Num = c(5,4,3,8,3,4,6), stringsAsFactors = FALSE)
> reference
  ID   Code Num
  1 Credit   5
  1  Price   4
  1   Cust   3
  1   Task   8
  2 Credit   3
  2   Task   4
  4   Cust   6

Я бы хотел преобразовать в:

> IdealOutput
  ID Customer Credit Price Cust Task
1  1      Bob      5     4    3    8
2  2     Mary      3    NA   NA    4
3  3     Bill     NA    NA   NA   NA
4  4    Steve     NA    NA    6   NA

EDIT

Наличие 2 столбцов заголовка с 2 столбцами значений.

> reference <- data.frame(ID = c(1,1,1,1,2,2,4), Code = c("Credit","Price","Cust","Task","Credit","Task","Cust"), Num = c(5,4,3,8,3,4,6), Code2 = c("Banana","Apple","Pear","Grapes","Pear","Grapes","Banana"), Num2 = c(2,5,4,7,3,6,5), stringsAsFactors = FALSE)
> reference
  ID   Code Num  Code2 Num2
1  1 Credit   5 Banana    2
2  1  Price   4  Apple    5
3  1   Cust   3   Pear    4
4  1   Task   8 Grapes    7
5  2 Credit   3   Pear    3
6  2   Task   4 Grapes    6
7  4   Cust   6 Banana    5

Я бы хотел преобразовать его в:

> IdealOutput
  ID Customer Credit Price Cust Task Banana Apple Pear Grapes
1  1      Bob      5     4    3    8      2     5    4      7
2  2     Mary      3    NA   NA    4     NA    NA    3      6
3  3     Bill     NA    NA   NA   NA     NA    NA   NA     NA
4  4    Steve     NA    NA    6   NA      5    NA   NA     NA

Я могу сделать два отдельных spreads, а затем Left_join, но это не интуитивно понятно.

1 Ответ

1 голос
/ 03 мая 2019

Мы можем сделать full_join по 'ID', а затем sread

library(tidyverse)
full_join(reference, maindata) %>% 
      spread(Code, Num) %>%
      select(1:6)
#   ID Customer Credit Cust Price Task
#1  1      Bob      5    3     4    8
#2  2     Mary      3   NA    NA    4
#3  3     Bill     NA   NA    NA   NA
#4  4    Steve     NA    6    NA   NA
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...