Если это мой набор данных

Id   Weight   Category
1    10.2     Pre
1    12.1     Post
2    11.3     Post
3    12.9     Pre
4    10.3     Post
4    12.3     Pre
5    11.8     Pre

Как мне избавиться от повторяющихся идентификаторов, которые также являются Category = Pre. Мой последний ожидаемый набор данных будет

Id   Weight   Category

1    12.1     Post
2    11.3     Post
3    12.9     Pre
4    10.3     Post
5    11.8     Pre
2
bison2178 10 Окт 2021 в 10:27

3 ответа

Лучший ответ

Используя by, разделите dat на Id и выберите Post, затем результат rbind.

do.call(rbind, by(dat, dat$Id, function(x) 
  if (nrow(x) == 2)  x[x$Category == 'Post', ] else x))
#   Id Weight Category
# 1  1   12.1     Post
# 2  2   11.3     Post
# 3  3   12.9      Pre
# 4  4   10.3     Post
# 5  5   11.8      Pre

< EM> Данные:

dat <- read.table(header=T, text='
                  Id   Weight   Category
1    10.2     Pre
1    12.1     Post
2    11.3     Post
3    12.9     Pre
4    10.3     Post
4    12.3     Pre
5    11.8     Pre
                  ')
2
jay.sf 10 Окт 2021 в 07:36

Вы можете упорядочить данные, а затем использовать distinct.

library(dplyr)

df %>% arrange(Id, Category) %>% distinct(Id, .keep_all = TRUE)

#  Id Weight Category
#1  1   12.1     Post
#2  2   11.3     Post
#3  3   12.9      Pre
#4  4   10.3     Post
#5  5   11.8      Pre

Это работает, потому что 'Pre' > 'Post'.

2
Ronak Shah 10 Окт 2021 в 07:32

Мы могли бы использовать filter после группировки и упорядочивания, используя first(), поскольку Post стоит перед Pre:

df %>% 
  group_by(Id) %>% 
  arrange(Id, Category) %>% 
  filter(Category ==first(Category)) 

Выход:

     Id Weight Category
  <int>  <dbl> <chr>   
1     1   12.1 Post    
2     2   11.3 Post    
3     3   12.9 Pre     
4     4   10.3 Post    
5     5   11.8 Pre    
0
TarJae 10 Окт 2021 в 08:01