简体   繁体   中英

keeping certain rows in data frame with a condition

I have a data frame in R for which I want to remove certain rows provided that match certain conditions. How can I do it ?

I have tried using dplyr and ifelse but my code does not give right answer

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

Does not work! gives the entire data set

Input is:

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

Output expected:

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

I want to have the output such that for IDs where both prod or NA are there, keep only rows with prod R , but if only one prod is there then keep that row despite the prod .

Using dplyr we can use filter to select rows where prod == "R" or if there is only one row in the group, select that row.

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

Here solution using an 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)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM