使用%in%和子集的逻辑运算符

时间:2017-06-06 20:18:02

标签: r dplyr logical-operators

我有一个按季度拆分的测试数据集:

> test
   id quarter
1   7      Q1
2   7      Q1
3   5      Q1
4   8      Q1
5   3      Q1
6   6      Q1
7  10      Q1
8   3      Q2
9  10      Q2
10  8      Q2
11  2      Q2
12  7      Q2
13  6      Q2
14  6      Q3
15  9      Q3
16  6      Q3
17  4      Q3
18  9      Q3
19  2      Q3
20  5      Q4
21  8      Q4
22 10      Q4
23  7      Q4
24  1      Q4
25  8      Q4

subsets <-split(test, test$quarter, drop=TRUE)

for (i in 1:length(subsets)) {
  assign(paste0("Q", i), as.data.frame(subsets[[i]]))
}

现在我的目标是找出Q3中不在Q1Q2中的所有唯一ID。使用%in%运算符我尝试:

Q1_ids <- unique(Q1$id)
Q2_ids <- unique(Q2$id)

Q3_ids <- subset(unique(Q3$id), !(unique(Q3$id) %in% Q1_ids | Q2_ids))

然后我收到operations are possible only for numeric, logical or complex types的错误。我可以通过一个向量进行子集化,例如,如果我只使用Q1_ids,但我不能使用逻辑运算符。使用subset()函数或其他方法解决问题的解决方案是什么?

> dput(test)
structure(list(id = c(7, 7, 5, 8, 3, 6, 10, 3, 10, 8, 2, 7, 6, 
6, 9, 6, 4, 9, 2, 5, 8, 10, 7, 1, 8), quarter = c("Q1", "Q1", 
"Q1", "Q1", "Q1", "Q1", "Q1", "Q2", "Q2", "Q2", "Q2", "Q2", "Q2", 
"Q3", "Q3", "Q3", "Q3", "Q3", "Q3", "Q4", "Q4", "Q4", "Q4", "Q4", 
"Q4")), .Names = c("id", "quarter"), row.names = c(NA, -25L), class = "data.frame", index = structure(integer(0), "`__quarter`" = integer(0)))

2 个答案:

答案 0 :(得分:2)

Q3_ids <- unique(setdiff(Q3$id , union(Q2$id, Q1$id)))

答案 1 :(得分:0)

您总是可以编写一个提取您要查找的元素的函数,然后调用map(或apply函数)将该函数应用于每个季度。这个特殊的整数解决方案将输出一个命名列表,其中包含每个季度所需的输出:

library(tidyverse)

get_distinct <- function(x, data) {
  distinct_id <- data[data$quarter == x, 1] %>% 
      unique()
  setdiff(distinct_id, data[!data$quarter == x, 1]  %>% 
      unique())
}

quarters <- unique(test$quarter)

dat <- map(.x = quarters, .f = get_distinct, data = test) %>% 
    set_names(quarters)