R: Наличие уникальных строк, кроме одной ячейки, как получить уникальные строки, сохраняя различия - PullRequest
0 голосов
/ 02 июля 2018

Я работаю над некоторыми данными, подобными этим:

df <- data.frame(
      point = c('a','b','b','c'),
      value =c(1,2,2,3),
      x_p2=c(5,6,6,7),
      y_p2 =c(3,4,4,3),
      date =c(1,4,4,7),
      variable =c(4,3,3,1),
     other =c('x','zz','zk','x')
                )

> df
  point value x_p2 y_p2 date variable other
1     a     1    5    3    1        4     x
2     b     2    6    4    4        3    zz
3     b     2    6    4    4        3    zk
4     c     3    7    3    7        1     x

Как видите, каждая строка уникальна, кроме второй и третьей строк, они отличаются только для столбца other.
Я хотел бы иметь такой результат, как уникальный, но объединяющий необычные результаты: чтобы быть более понятным, я хотел бы получить такой результат:

  point value x_p2 y_p2 date variable other
1     a     1    5    3    1        4     x
2     b     2    6    4    4        3    zz/zk
3     c     3    7    3    7        1     x

Я пытался с помощью функции unique(), но, очевидно, она берет первые не равные строки, и все мои строки различаются в каждом столбце, кроме того, он не «плавит» другое поле, которое отличается, и я бы хотел бы сохранить это.
Я не знаю, как это понять (ни название этого вопроса, если честно). Что вы посоветуете? Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 02 июля 2018

Вот вариант base R с merge и unique. Получите строки unique, удалив последний столбец, и merge с paste ed 'other' aggregated на 'point'

merge(unique(df[-ncol(df)]), aggregate(other ~ point, df, paste, collapse="/"))
#  point value x_p2 y_p2 date variable other
#1     a     1    5    3    1        4     x
#2     b     2    6    4    4        3 zz/zk
#3     c     3    7    3    7        1     x

Если мы хотим сохранить столбец list, это можно сделать с summarise

library(tidyverse)
df %>% 
    group_by_at(vars(names(.)[1:6])) %>% 
    summarise(other = list(other))

Или с aggregate

aggregate(other ~ ., df, I)
0 голосов
/ 02 июля 2018
 aggregate(df,list(do.call(paste,df[-7])),function(x)unique(x))[-1]
  point value x_p2 y_p2 date variable  other
1     a     1    5    3    1        4      x
2     b     2    6    4    4        3 zz, zk
3     c     3    7    3    7        1      x
0 голосов
/ 02 июля 2018

Используя dplyr

df%>%group_by( point,value,x_p2,y_p2,date,variable)%>%dplyr::summarise(other=paste(other,collapse='/'))
# A tibble: 3 x 7
# Groups:   point, value, x_p2, y_p2, date [?]
   point value  x_p2  y_p2  date variable other
  <fctr> <dbl> <dbl> <dbl> <dbl>    <dbl> <chr>
1      a     1     5     3     1        4     x
2      b     2     6     4     4        3 zz/zk
3      c     3     7     3     7        1     x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...