Как объединить указанные c данные в нескольких строках в кадре данных в R - PullRequest
1 голос
/ 08 января 2020

Я хочу изменить (объединить, изменить, я не уверен, какое слово подходит для этого сценария) данных в моем фрейме данных путем объединения ячеек данных строк в 1 столбце, где другие столбцы в этой строке идентичны.

По сути, у меня есть что-то вроде этого:

    >df
    >Person_id     System_id    Category    Type    Tag
    >1A            134          1            Chr     Question
    >1A            134          1            Chr     Answer
    >1A            134          1            Chr     Evaluation
    >1A            134          1            Chr     Overall
    >1A            134          1            Chr     Analysis
    >Z4            002          1            Chr     Question
    >Z4            002          1            Chr     Answer

И чтобы это выглядело примерно так:

    >Person_id     System_id    Category    Type    Tag
    >1A            134          1            Chr     Question, Answer, Evaluation, Overall, Analysis
    >Z4            002          1            Chr     Question, Answer

Теги не нужно разделять через запятую, пробел в порядке. Любые идеи, где искать такое решение, были бы полезны.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 08 января 2020

Мы можем сгруппировать по первым четырем столбцам и paste элементам 'Tag' вместе

library(dplyr)
df %>%
   group_by_at(1:4) %>%
   summarise(Tag = toString(Tag))
# A tibble: 2 x 5
# Groups:   Person_id, System_id, Category [2]
#  Person_id System_id Category Type  Tag                                            
#  <chr>         <int>    <int> <chr> <chr>                                          
#1 1A              134        1 Chr   Question, Answer, Evaluation, Overall, Analysis
#2 Z4                2        1 Chr   Question, Answer    

Или используя base R

aggregate(Tag ~ ., df, toString)

ПРИМЕЧАНИЕ: toString - это удобная оболочка для paste(., collapse=", ")

data

df <- structure(list(Person_id = c("1A", "1A", "1A", "1A", "1A", "Z4", 
"Z4"), System_id = c(134L, 134L, 134L, 134L, 134L, 2L, 2L), Category = c(1L, 
1L, 1L, 1L, 1L, 1L, 1L), Type = c("Chr", "Chr", "Chr", "Chr", 
"Chr", "Chr", "Chr"), Tag = c("Question", "Answer", "Evaluation", 
"Overall", "Analysis", "Question", "Answer")), 
 class = "data.frame", row.names = c(NA, 
-7L))
1 голос
/ 08 января 2020

Вы можете использовать paste0 с collapse = ", " для достижения этого:

library(dplyr)
    df %>%
      group_by(Person_id, System_id, Category, Type) %>%
      summarise(Tag = paste0(Tag, collapse = ", "))

#Person_id System_id Category Type  Tag                                            
#  <chr>         <int>    <int> <chr> <chr>                                          
#1 1A              134        1 Chr   Question, Answer, Evaluation, Overall, Analysis
#2 Z4                2        1 Chr   Question, Answer
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...