R группа повторяющихся значений - PullRequest
1 голос
/ 20 марта 2020

Если я имею дело с таким набором данных

  Id     Index    Value
  1233   i1       Blue
  1233   i2       Blue
  1233   i3       Blue
  6545   i1       Red
  6545   i2       NA
  6545   i3       Black
  4177   i1       NA
  4177   i2       NA 
  4177   i2       NA 

Как создать новый набор данных, сохранив только один экземпляр повторяющихся значений для Id, например 1233 и 4177, как показано ниже.

  Id     Index    Value
  1233   i        Blue
  6545   i1       Red
  6545   i2       NA
  6545   i3       Black
  4177   i        NA

Ответы [ 3 ]

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

Мы можем использовать distinct

library(dplyr)
distinct(df1, Id, Value, .keep_all = TRUE)
#    Id Index Value
#1 1233    i1  Blue
#2 6545    i1   Red
#3 6545    i2  <NA>
#4 6545    i3 Black
#5 4177    i1  <NA>

Или используя base R

df1[!duplicated(df1[c('Id', 'Value')]),]

данные

df1 <- structure(list(Id = c(1233L, 1233L, 1233L, 6545L, 6545L, 6545L, 
4177L, 4177L, 4177L), Index = c("i1", "i2", "i3", "i1", "i2", 
"i3", "i1", "i2", "i2"), Value = c("Blue", "Blue", "Blue", "Red", 
NA, "Black", NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-9L))
1 голос
/ 20 марта 2020

Может быть unique + rownames может помочь вам

df[as.numeric(rownames(unique(df[-2]))),]

таким, что

    Id Index Value
1 1233    i1  Blue
4 6545    i1   Red
5 6545    i2  <NA>
6 6545    i3 Black
7 4177    i1  <NA>

ДАННЫЕ

df <- structure(list(Id = c(1233L, 1233L, 1233L, 6545L, 6545L, 6545L, 
4177L, 4177L, 4177L), Index = c("i1", "i2", "i3", "i1", "i2", 
"i3", "i1", "i2", "i2"), Value = c("Blue", "Blue", "Blue", "Red", 
NA, "Black", NA, NA, NA)), class = "data.frame", row.names = c(NA, 
-9L))
0 голосов
/ 20 марта 2020

Вы можете использовать data.table пакет и аргумент by его unique метода:

library(data.table)
unique(setDT(df), by = c("Id", "Value"))
#       Id  Index  Value
# 1:  1233     i1   Blue
# 2:  6545     i1    Red
# 3:  6545     i2   <NA>
# 4:  6545     i3  Black
# 5:  4177     i1   <NA>
...