首页 > 解决方案 > 选择包含值 x 或值 y 的 df

问题描述

我的数据整理有问题。

我的一个列中有一个具有不同日期的data.frame。还有一列我正在分组,但这不应该是问题。现在,我只想过滤 df,新的 df 包含日期 x 或日期 y(例如 20-03-18 或 20-03-19)。我尝试了函数 xor() 但我挣扎了很多并且没有得到任何结果。

new_df<-df%>%    
group_by(animals_id)%>% 
filter(any(day==xor("20-03-18", "20-03-19"))

最后,我只想拥有包含日期​​“20-03-18”或(不是&)“20-03-19”的animals_id

我也尝试过filter(any(day==c("20-03-18", "20-03-19")),但这只是包含两个日期的过滤器

谢谢你的帮助!

df<-structure(list(animals_id = c("Hedwig", "Hedwig", "Hedwig", "Hedwig", 
"Hedwig", "Hedwig", "Heidi", "Heidi", "Heidi", 
"Heidi", "Heidi", "Heidi"), day = structure(c(17937, 
17938, 17939, 17940, 17941, 17942, 18304, 18305, 18306, 18307, 
18308, 18309), class = "Date")), row.names = c(NA, -12L), class = "data.frame")

标签: rdataframefiltertidyversedata-wrangling

解决方案


因为您提供的数据没有包含日期​​“2020-03-18”或“2020-03-19”的行,所以我必须包含一些包含这些日期的示例行,如下所示:

df <- bind_rows(
  df,
  data.frame(
    animals_id = c("Hedwig", "Hedwig"),
    day = as.Date(c("2020-03-18", "2020-03-19"))
  )
)

考虑到这一点,以及您的最后评论,我知道您首先要确定animals_id在这些日期中具有一定价值的所有内容。然后,您要过滤属于这些的所有数据animals_id。换句话说,您要消除,animals_id在这些日期中没有任何价值的所有数据。在我的示例中,只有“Hedwig” id 在这些日期中有一些值,因此您要过滤属于“Hedwig” id 的所有数据。

首先,为了识别所有的animals_id,我使用包中的运算%in%符。这样,将选择包含其中一些日期的每一行。然后我按 animal_id 分组并用一些统计数据进行总结,因为我只对确定这些过滤行中的动物 id 感兴趣。filter()dplyrfilter()

library(dplyr)
library(magrittr)

select_animals_id <- df %>% 
  filter(day %in% as.Date(c("2020-03-18", "2020-03-19"))) %>% 
  group_by(animals_id) %>% 
  count()

然后,我再次使用%in%运算符 infilter()来搜索表中的每一行df,其中列中的值animals_id存在于表中的animals_id列中select_animals_id。因为表中只存在“Hedwig” id select_animals_id,所以%in%操作员将找到列中df包含“Hedwig”的每一行animals_id

df <- df %>% 
  filter(animals_id %in% select_animals_id$animals_id)

结果是:

  animals_id        day
1     Hedwig 2019-02-10
2     Hedwig 2019-02-11
3     Hedwig 2019-02-12
4     Hedwig 2019-02-13
5     Hedwig 2019-02-14
6     Hedwig 2019-02-15
7     Hedwig 2020-03-18
8     Hedwig 2020-03-19

推荐阅读