Сохраняйте уникальные строки в data.frame и агрегируйте неуникальные строки - PullRequest
0 голосов
/ 12 июня 2018

У меня есть data.frame, который не является уникальным для подмножества его столбцов, и я хочу получить уникальную часть неуникальных столбцов и соответствующую совокупность (через collapse) уникальных столбцов.

Вот пример:

library(dplyr)

set.seed(1)
df <- data.frame(v1=rnorm(5), v2=rnorm(5), v3=rnorm(5), id=paste0("id",1:5))

#Replicate a couple of rows adding different ids:
df <- df %>% rbind(df[sample(5,2,replace = F),] %>% dplyr::mutate(id=paste0("id",6:7)))

> df
          v1         v2       v3  id
1 -0.6264538 -0.8204684  1.5117812 id1
2  0.1836433  0.4874291  0.3898432 id2
3 -0.8356286  0.7383247 -0.6212406 id3
4  1.5952808  0.5757814 -2.2146999 id4
5  0.3295078 -0.3053884  1.1249309 id5
6 -0.8356286  0.7383247 -0.6212406 id6
7  0.3295078 -0.3053884  1.1249309 id7

Поскольку реплицированы строки 3 и 5, результирующее data.frame будет:

> data.frame(df[1:5,] %>% dplyr::select(-id),id=c("id1","id2","id3,id6","id4","id5,id7"))

          v1         v2       v3      id
1 -0.6264538 -0.8204684  1.5117812     id1
2  0.1836433  0.4874291  0.3898432     id2
3 -0.8356286  0.7383247 -0.6212406 id3,id6
4  1.5952808  0.5757814 -2.2146999     id4
5  0.3295078 -0.3053884  1.1249309 id5,id7

Есть ли dplyr илиtidyr способ сделать это?

Ответы [ 2 ]

0 голосов
/ 12 июня 2018

Поскольку я думаю, что это полезно, вот полное решение, которое включает передачу строкового вектора в summarise:

df %>%
  group_by_(.dots=c("v1","v2","v3")) %>%
  summarise(id=toString(id))

# A tibble: 5 x 4
# Groups:   v1, v2 [?]
          v1         v2         v3       id
       <dbl>      <dbl>      <dbl>    <chr>
1 -0.8356286  0.7383247 -0.6212406 id3, id6
2 -0.6264538 -0.8204684  1.5117812      id1
3  0.1836433  0.4874291  0.3898432      id2
4  0.3295078 -0.3053884  1.1249309 id5, id7
5  1.5952808  0.5757814 -2.2146999      id4
0 голосов
/ 12 июня 2018
df%>%
   group_by(v1,v2,v3)%>%
   summarise(id=toString(id))
# A tibble: 5 x 4
# Groups:   v1, v2 [?]
      v1     v2     v3 id
   <dbl>  <dbl>  <dbl> <chr>         
1 -0.836  0.738 -0.621 id3, id6      
2 -0.626 -0.820  1.51  id1           
3  0.184  0.487  0.390 id2           
4  0.330 -0.305  1.12  id5, id7      
5  1.60   0.576 -2.21  id4           


df%>%
   group_by(v1,v2,v3)%>%
   summarise(id=toString(id))%>%data.frame()
          v1         v2         v3       id
1 -0.8356286  0.7383247 -0.6212406 id3, id6
2 -0.6264538 -0.8204684  1.5117812      id1
3  0.1836433  0.4874291  0.3898432      id2
4  0.3295078 -0.3053884  1.1249309 id5, id7
5  1.5952808  0.5757814 -2.2146999      id4
...