хранение определенных строк во фрейме данных с условием - PullRequest
3 голосов
/ 06 мая 2019

У меня есть фрейм данных в R, для которого я хочу удалить определенные строки при условии, что они соответствуют определенным условиям.Как я могу это сделать?

Я пытался использовать dplyr и ifelse, но мой код не дает правильного ответа

check8 <- distinct(df5,prod,.keep_all = TRUE)

Не работает!дает полный набор данных

Ввод:

check1 <- data.frame(ID = c(1,1,2,2,2,3,4), 
                     prod = c("R","T","R","T",NA,"T","R"), 
                     bad = c(0,0,0,1,0,1,0))
  #     ID prod bad
#    1  1    R   0
#    2  1    T   0
#    3  2    R   0
#    4  2    T   1
#    5  2 <NA>   0
#    6  3    T   1
#    7  4    R   0

Ожидаемый вывод:

data.frame(ID = c(1,2,3,4), 
           prod = c("R","R","T","R"), 
           bad = c(0,0,1,0))


    #  ID prod bad
   # 1  1    R   0
   # 2  2    R   0
   # 3  3    T   1
   # 4  4    R   0

Я хочу получить вывод, такой что для идентификаторов, где оба продукта или NA есть, оставьте только строки с продуктом R, но если там только один продукт, сохраните этот ряд, несмотря на продукт.

Ответы [ 2 ]

2 голосов
/ 06 мая 2019

Здесь решение с использованием anti_join

library(dplyr)

check1 <- data.frame(ID = c(1,1,2,2,2,3,4), prod = c("R","T","R","T",NA,"T","R"), bad = c(0,0,0,1,0,1,0))

# First part: select all the IDs which contain 'R' as prod

p1 <- check1 %>% 
  group_by(ID) %>% 
  filter(prod == 'R')

# Second part: using anti_join get all the rows from check1 where there are not 
# matching values in p1

p2 <- anti_join(check1, p1, by = 'ID')

solution <- bind_rows(
  p1, 
  p2
) %>% 
  arrange(ID)
2 голосов
/ 06 мая 2019

Используя dplyr, мы можем использовать filter для выбора строк, где prod == "R" или, если в группе только одна строка, выберите эту строку.

library(dplyr)

check1 %>%
  group_by(ID) %>%
  filter(prod == "R" | n() == 1)

#     ID prod    bad
#  <dbl> <fct> <dbl>
#1     1 R         0
#2     2 R         0
#3     3 T         1
#4     4 R         0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...