Извлечь все строки, соответствующие определенному логическому значению в R? - PullRequest
0 голосов
/ 23 октября 2018

Я сгенерировал фрейм данных, используя следующий код:

# Load package
library(tidyverse)

# Dataframe example
f.name<-c("A","A","A","B","B","C","C")
l.name<-c("X","X","X","Z","Z","V","V")
grade<-c(8,9,10,9,10,9,10)
year<-c(2013,2014,2015,2014,2015,2016,2017)

df<-data.frame(f.name,l.name,grade,year)
df


new.c<-df %>%
  group_by(f.name,l.name)%>%
  mutate(new.9=(grade==9 & year==2014 & row_number()==1))


  f.name l.name grade  year new.9
  <fct>  <fct>  <dbl> <dbl> <lgl>
1 A      X         8. 2013. FALSE
2 A      X         9. 2014. FALSE
3 A      X        10. 2015. FALSE
4 B      Z         9. 2014. TRUE 
5 B      Z        10. 2015. FALSE
6 C      V         9. 2016. FALSE
7 C      V        10. 2017. FALSE

Условно при нахождении значения TRUE в столбце new.9 я хочу извлечь все родительские записи, которые соответствуют этому значению TRUEиз фрейма данных.Так что я получаю

4 B      Z         9. 2014. TRUE 
5 B      Z        10. 2015. FALSE

Как я могу это сделать?

Ответы [ 3 ]

0 голосов
/ 23 октября 2018

С базой R

dfl <- split(new.c, new.c$l.name)
# this splits new.c into a data frame list - splitting by the column `l.name`

# select only those sub data frame in the data frame list
# which contain any TRUE values in the last column
# and by `Reduce(rbind, ...)`-ing the result, you make again a data frame out of
# the resulting data frame list -> so that you have a 
# data frame (tibble) at the end.
Reduce(rbind, dfl[sapply(dfl, function(df) any(df$l.name == TRUE))])
0 голосов
/ 23 октября 2018

filter и сделать inner_join:

new.c %>% filter(new.9 == TRUE) %>% 
    select(f.name,l.name) %>% 
inner_join(new.c)
0 голосов
/ 23 октября 2018
new.c %>%
  group_by(f.name, l.name) %>%
  filter(any(new.9))
  %>% ungroup()
# # A tibble: 2 x 5
#   f.name l.name grade  year new.9
#   <fct>  <fct>  <dbl> <dbl> <lgl>
# 1 B      Z          9  2014 TRUE 
# 2 B      Z         10  2015 FALSE
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...