我有一个数据框testData
,它由许多独特的ID组成。我的目标是确定ids是否包含month
,yday
和week
范围内的所有可能整数的全部 min是每个id的第一个值,max是整个列
请注意,这与related question here
不同换句话说,如果id
包含month
范围内的所有可能值,那么它应该会收到t
。例如,在month
下id
= 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
答案 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