查找范围内的所有数字,包括本地最小值和全局最大值

时间:2017-04-16 10:51:21

标签: r range data.table dplyr

我有一个数据框testData,它由许多独特的ID组成。我的目标是确定ids是否包含monthydayweek 范围内的所有可能整数的全部 min是每个id的第一个值,max是整个列

中的最大值

请注意,这与related question here

不同

换句话说,如果id包含month范围内的所有可能值,那么它应该会收到t。例如,在monthid = 1,最小值为2,整列的最大值为5,因此1应该收到一个真值,因为值为2,3,4然而,在id = 2的情况下,只有值1,2,4和5,因此跳过了3,因此2应该得到f

到目前为止,我有一个公式可以获取整个列范围内的所有值(但 NOT 每个id的最小值):

library(data.table)
setDT(testData)
output<-testData[,.(month=all(unique(testData$month)%in%.SD$month),yday=all(unique(testData$yday)%in%.SD$yday),week=all(unique(testData$week)%in%.SD$week)),by=(id)]

我知道如何整合min min每个id的最小值和max是该范围内的最大值吗?

> testData
   id month yday week
1   1     2    1    1
2   3     1    2    1
3   4     1    3    1
4   2     1    4    1
5   3     3    5    2
6   4     3    6    3
7   2     2    7    1
8   3     1    8    3
9   1     2    9    2
10  5     4   10    3
11  3     2   11    1
12  4     4   12    1
13  5     4   13    2
14  1     3   14    3
15  1     4   15    1
16  1     5   16    2
17  2     4   17    3
18  2     5   18    1
19  5     5   19    1


> dput(testData)
structure(list(id = c(1L, 3L, 4L, 2L, 3L, 4L, 2L, 3L, 1L, 5L, 
3L, 4L, 5L, 1L, 1L, 1L, 2L, 2L, 5L), month = c(2L, 1L, 1L, 1L, 
3L, 3L, 2L, 1L, 2L, 4L, 2L, 4L, 4L, 3L, 4L, 5L, 4L, 5L, 5L), 
    yday = 1:19, week = c(1L, 1L, 1L, 1L, 2L, 3L, 1L, 3L, 2L, 
    3L, 1L, 1L, 2L, 3L, 1L, 2L, 3L, 1L, 1L)), .Names = c("id", 
"month", "yday", "week"), class = "data.frame", row.names = c(NA, 
-19L))

最后,输出应如下所示:

> output
  id month yday week
1  1     t    f    t
2  2     f    f    f
3  3     f    f    t
4  4     f    f    f
5  5     t    f    t

1 个答案:

答案 0 :(得分:0)

使用dplyr,您可以按id进行分组,然后检查该范围的所有元素是否都在每个组的值中。请注意,min(month)给出了分组id变量的分钟数,但max(testData$month)给出了整个列表的最大值。

library(dplyr)
tD2 <- testData %>% group_by(id) %>% 
  summarise(month=all(min(month):max(testData$month) %in% month),
            yday=all(min(yday):max(testData$yday) %in% yday),
            week=all(min(week):max(testData$week) %in% week))

tD2
# A tibble: 5 × 4
     id month  yday  week
  <int> <lgl> <lgl> <lgl>
1     1  TRUE FALSE  TRUE
2     2 FALSE FALSE FALSE
3     3 FALSE FALSE  TRUE
4     4 FALSE FALSE FALSE
5     5  TRUE FALSE  TRUE