Сгруппируйте данные на основе уникального идентификатора, а затем вставьте их в одну строку - PullRequest
0 голосов
/ 30 мая 2019

У меня есть подмножество моих данных:

a3 <- structure(list(Employee.Number = c("10034", "10034", "10034"), 
               Employee.Full.Name = c("Wayne, Bruce", "Wayne, Bruce", 
                                      "Wayne, Bruce"), Case.No = c("78582", "87758", "87758"), 
               Diagnoses.No = c("1", "2", "1"), Diagnosis.Medical.Code.Code = c("151.9", 
                                                                                "285.9", "V70-V82"), Diagnosis.Medical.Code.Description = c("Stomach, unspecified", 
                                                                                                                                            "Anemia, unspecified", "Tummy AChe"
                                                                                )), row.names = c(NA, -3L), class = "data.frame")

Как мне поступить с группировкой Case.No и если «Diagnoses.No» равно 2 (фактические данные имеют номера> 2),тогда последние 3 столбца будут вставлены в столбец того же Case.no с помощью Diagnoses.No с 1 при удалении исходного столбца?

Желаемые результаты:


10034  Wayne, Bruce  78582  1  151.9    Stomach, unspecified   NA


10034  Wayne, Bruce  87758  1  V70-V82  Tummy AChe 2  285.9    Anemia, unspecified

Ответы [ 3 ]

0 голосов
/ 30 мая 2019

Презентация немного отличается от того, что вы хотели, но посмотрите, работает ли она для вас.

tidyverse решение:

# function to concartinate columns
cat_function <- function(df){
  map_df(df, ~paste(unlist(.), collapse = " / "))
}

a3 %>% 
  group_by(Employee.Number, Employee.Full.Name, Case.No) %>% 
  nest %>% 
  transmute(Employee.Number, Employee.Full.Name, Case.No, 
             res = map(data, cat_function)) %>% 
  unnest
0 голосов
/ 30 мая 2019

Я не уверен в желаемом выводе, но я думаю, что этот скрипт может помочь.Он использует пакет data.table:

library(data.table)
a3<-data.table(a3)

a2 <-a3[Diagnoses.No==2,list(Employee.Number,Employee.Full.Name,Case.No, 
                             x=paste0(Diagnoses.No, ' ', Diagnosis.Medical.Code.Code), Diagnosis.Medical.Code.Description),]

a1 <-a3[Diagnoses.No==1,]

a3 <- merge(a1,a2, by=c('Employee.Number','Employee.Full.Name','Case.No'), all.x=T)
a3 <- a3[,list(Employee.Number,Employee.Full.Name,Case.No,Diagnosis.Medical.Code.Code, 
            Diagnosis.Medical.Code.Description.x= paste0(Diagnosis.Medical.Code.Description.x,' ',x),
            Diagnosis.Medical.Code.Description.y)]

Вывод похож на ваш запрос:

> a3
   Employee.Number Employee.Full.Name Case.No Diagnosis.Medical.Code.Code Diagnosis.Medical.Code.Description.x Diagnosis.Medical.Code.Description.y
1:           10034       Wayne, Bruce   78582                       151.9              Stomach, unspecified NA                                 <NA>
2:           10034       Wayne, Bruce   87758                     V70-V82                   Tummy AChe 2 285.9                  Anemia, unspecified

Надеюсь, это поможет!

0 голосов
/ 30 мая 2019

Если я правильно понимаю, ОП хочет изменить несколько столбцов значений из длинного в широкий формат.

Один из возможных подходов - использовать функцию reshape() в базе R:

reshape(a3, v.names = c("Diag.MC.Code", "Diag.MC.Descr"), timevar = "Diag.No", 
        idvar = c("Emp.No", "Emp.Full.Name", "Case.No"), direction = "wide")
  Emp.No Emp.Full.Name Case.No Diag.MC.Code.1      Diag.MC.Descr.1 Diag.MC.Code.2     Diag.MC.Descr.2
1  10034  Wayne, Bruce   78582          151.9 Stomach, unspecified           <NA>                <NA>
2  10034  Wayne, Bruce   87758        V70-V82           Tummy AChe          285.9 Anemia, unspecified

Обратите внимание, что имена столбцов были переименованы (сокращены), чтобы таблица результатов помещалась на странице.

Данные

a3 <- structure(list(Emp.No = c("10034", "10034", "10034"), Emp.Full.Name = c("Wayne, Bruce", 
"Wayne, Bruce", "Wayne, Bruce"), Case.No = c("78582", "87758", 
"87758"), Diag.No = c("1", "2", "1"), Diag.MC.Code = c("151.9", 
"285.9", "V70-V82"), Diag.MC.Descr = c("Stomach, unspecified", 
"Anemia, unspecified", "Tummy AChe")), row.names = c(NA, -3L), class = "data.frame")

# abbreviate column names to make result table fit on page
a3 <- setNames(a3, c("Emp.No", "Emp.Full.Name", "Case.No", "Diag.No", 
                     "Diag.MC.Code", "Diag.MC.Descr"))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...