#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=';;')})
Определение временной функции необходимо для указания параметра свертывания в качестве специального выбора ;;
.