Как пометить / удалить указанные c дубликаты на основе других переменных - PullRequest
0 голосов
/ 14 января 2020

Я хотел бы знать, как я могу удалить определенные c строки на основе указанных c значений в столбцах, но эти удаления зависят от другой переменной в подгруппе. Я хотел бы удалить "aja" , если он подгруппирован вместе с "ase" . Если в подгруппе есть и «ase», и «aja», скрипт должен оставить это в покое. Я указал, какие из них должны быть удалены сценарием.

   id  somedata  subgroup
1  1   "aja"     okay
2  1   "aja"     okay
3  2   "ase"     okay
4  2   "aja"     delete
5  3   "aja"     delete
6  3   "ase"     okay
7  4   "aja"     okay
8  4   "aja"     okay
9  5   "ase"     okay
10 5   "ase"     okay
11 6   "aja"     delete
12 6   "ase"     okay




Code to generate the data

    id = c(1,1,2,2,3,3,4,4,5,5,6,6)
    somedata = c("aja","aja","ase","aja","aja","ase","aja","aja","ase","ase","aja","ase")
    subgroup = c("okay","okay","okay","DELETE","DELETE","okay","okay","okay","okay","okay","DELETE","okay")
    proov = data.frame(cbind(id,somedata,subgroup))

Ответы [ 3 ]

2 голосов
/ 14 января 2020

Мы можем сгруппировать по id и удалить строки, где `somedata ==" aja "и есть хотя бы одна" ase "

library(dplyr)

proov %>% group_by(id) %>% filter(!(somedata == "aja" & any(somedata == "ase")))

#  id    somedata subgroup
# <fct> <fct>    <fct>   
#1 1     aja      okay    
#2 1     aja      okay    
#3 2     ase      okay    
#4 3     ase      okay    
#5 4     aja      okay    
#6 4     aja      okay    
#7 5     ase      okay    
#8 5     ase      okay    
#9 6     ase      okay    

, которую в базе R можно записать как

subset(proov, !as.logical(ave(as.character(somedata), 
               id, FUN = function(x) x == "aja" & any(x == "ase"))))
2 голосов
/ 14 января 2020

Вы можете сделать простую фильтрацию, т.е.

library(dplyr)

proov %>% 
 group_by(id) %>% 
 filter(!(n_distinct(somedata) > 1 & somedata == 'aja'))

, что дает,

# A tibble: 9 x 3
# Groups:   id [6]
  id    somedata subgroup
  <fct> <fct>    <fct>   
1 1     aja      okay    
2 1     aja      okay    
3 2     ase      okay    
4 3     ase      okay    
5 4     aja      okay    
6 4     aja      okay    
7 5     ase      okay    
8 5     ase      okay    
9 6     ase      okay    
0 голосов
/ 14 января 2020

Без использования каких-либо дополнительных пакетов вы можете использовать эту команду:

proov = proov[!(proov$id %in% unique(proov[which(proov$somedata == "ase"), "id"]) & proov$somedata == "aja"),]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...