Объединение строк в фрейме данных на основе частичного дублирования

#r #dataframe #duplicates

#r #фрейм данных #дубликаты

Вопрос:

У меня есть dataframe df, в котором некоторые строки содержат одинаковые значения, а одна — нет.

 V1    V2    V3
a     b     c
a     b     d
1     2     3
1     2     4
  

Я хотел бы удалить те строки, которые содержат одинаковые значения для df $ V1 и df $ V2, а затем объединить значения в V3, используя «;;» в качестве разделителя следующим образом:

 V1    V2    V3
a     b     c;;d
1     2     3;;4
  

Спасибо!

Ответ №1:

Решение, основанное на tidyverse, может выглядеть следующим образом.

 library(dplyr)
library(stringr)

df %>%
  group_by(V1, V2) %>%
  mutate(V3 = if_else(n() > 1, str_c(V3, collapse = ';;'), V3[1])) %>%
  ungroup() %>%
  distinct()

#   V1    V2    V3   
#   <chr> <chr> <chr>
# 1 a     b     c;;d 
# 2 1     2     3;;4
  

df

 structure(list(V1 = c("a", "a", "1", "1"), V2 = c("b", "b", "2", 
"2"), V3 = c("c", "d", "3", "4")), row.names = c(NA, -4L), class = c("tbl_df", 
"tbl", "data.frame"))
  

Ответ №2:

Для этой цели вы можете использовать агрегатную функцию и передать paste в качестве агрегатной функции:

 aggregate(V3~V1 V2, df, FUN=function(x){paste(x, collapse=';;')})
  

Определение временной функции необходимо для указания параметра свертывания в качестве специального выбора ;; .