Объединить несколько строк на основе общих значений - PullRequest
1 голос
/ 29 марта 2020

У меня есть такой набор данных ниже

  W X Y Z
  A 2 3 4
  A 2 3 6
  B 1 2 3
  C 3 2 1
  B 1 3 4
  B 1 2 2

Я хочу объединить / свернуть значения в столбце Z, только если значения в столбце W, X, Y похожи. Окончательный набор данных будет таким:

  W X Y Z
  A 2 3 4,6
  B 1 2 3,2
  C 3 2 1
  B 1 3 4

Не уверен, как это сделать, любые предложения очень ценятся.

1 Ответ

2 голосов
/ 29 марта 2020

Мы можем сгруппировать по 'W', 'X', 'Y' и paste значениям 'Z' (toString равно paste(..., collapse=", "))

library(dplyr)
df1 %>%
   group_by(W, X, Y) %>%
   summarise(Z = toString(unique(Z)))
# A tibble: 4 x 4
# Groups:   W, X [3]
#  W         X     Y Z    
#  <chr> <int> <int> <chr>
#1 A         2     3 4, 6 
#2 B         1     2 3, 2 
#3 B         1     3 4    
#4 C         3     2 1    

или с aggregate из base R

aggregate(Z ~ ., unique(df1), toString)
#  W X Y    Z
#1 B 1 2 3, 2
#2 C 3 2    1
#3 B 1 3    4
#4 A 2 3 4, 6

data

df1 <- structure(list(W = c("A", "A", "B", "C", "B", "B"), X = c(2L, 
2L, 1L, 3L, 1L, 1L), Y = c(3L, 3L, 2L, 2L, 3L, 2L), Z = c(4L, 
6L, 3L, 1L, 4L, 2L)), class = "data.frame", row.names = c(NA, 
-6L))
...