Как объединить строки в кадре данных и объединить значения факторов в ячейках - PullRequest
1 голос
/ 30 октября 2019

У меня в R есть фрейм данных, в котором я хочу объединить определенные строки и объединить значения определенных ячеек в этих строках. Представьте себе следующий фрейм данных:

Col.1<-c("a","b","b","a","c","c","c","d") Col.2<-c("mouse", "cat", "dog", "bird", "giraffe", "elephant", "zebra", "worm") df<-data.frame(Col.1, Col.2) df

Col.1 Col.2 a mouse b cat b dog a bird c giraffe c elephant c zebra d worm

Я хотел бы объединить все смежные строки, в которых значения в столбце 1 совпадают, исоответственно объедините значения в столбце 2.

Окончательный результат должен выглядеть следующим образом:

Col.1 Col.2 a mouse b cat dog a bird c giraffe elephant zebra d worm

Я попытался использовать dplyr-решение (например:ddply(df, .(Col.1), summarize, Col.2 = sum(Col.2))), но команда sum не работает для значений факторов.

Ответы [ 2 ]

1 голос
/ 30 октября 2019

EDIT: пропущен «соседний» бит. Смотрите решение, используя базовую функцию rle ниже от этого вопроса .

Col.1 <- c("a","b","b","a","c","c","c","d")
Col.2 <- c("mouse", "cat", "dog", "bird", "giraffe", "elephant", "zebra", "worm")
df <- tibble(Col.1, Col.2)

rlel <- rle(df$Col.1)$length
df %>% 
  mutate(adj = unlist(lapply(1:length(rlel), function(i) rep(i, rlel[i])))) %>%
  group_by(Col.1, adj) %>% 
  summarize(New.Col.2 = paste(Col.2, collapse = " ")) %>%
  ungroup %>% arrange(adj) %>% select(-adj)
# A tibble: 5 x 2
  Col.1 New.Col.2             
  <chr> <chr>                 
1 a     mouse                 
2 b     cat dog             
3 a     bird             
4 c     giraffe elephant zebra
5 d     worm   
1 голос
/ 30 октября 2019

Мы можем сделать группу по пасте. Чтобы выполнить группировку для смежных похожих элементов, можно использовать rleid из data.table, а затем summarise значения 'Col.2' на paste ing

library(dplyr)
library(data.table)
library(stringr)
df %>%
    group_by(Col.1, grp = rleid(Col.1)) %>% 
    summarise(Col.2 = str_c(Col.2, collapse=' ')) %>%
    ungroup %>%
    select(-grp)
# A tibble: 5 x 2
#  Col.1 Col.2                 
#  <fct> <chr>                 
#1 a     mouse                 
#2 a     bird                  
#3 b     cat dog               
#4 c     giraffe elephant zebra
#5 d     worm         

ПРИМЕЧАНИЕ. Этосоответствует выводу, показанному в посте ОП

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