我试图使用连续两列中的值来本质上在单独列表中的集合中进行查找。
下面是一个代码段:
library(tidyverse)
# Sample days and hour of day
df_hours <- tibble(
dow = as.integer(c(rep(1, 5), rep(2, 5))),
hour = as.integer(rep(c(0:4), 2)),
)
# Sample hours open. One set per day of week
open_hrs <- list(c(01:03), c(03:04))
# Show before
df_hours
数据:
# A tibble: 10 x 2
dow hour
<int> <int>
1 1 0
2 1 1
3 1 2
4 1 3
5 1 4
6 2 0
7 2 1
8 2 2
9 2 3
10 2 4
然后尝试查找:
# Lookup the hour in the dow open_hrs set and add the result for the row
df_hours <- df_hours %>%
mutate(
open = ifelse(hour %in% unlist(open_hrs[ dow ]), 1, 0)
)
# Show result
df_hours
结果:
# A tibble: 10 x 3
dow hour open
<int> <int> <dbl>
1 1 0 0
2 1 1 1
3 1 2 1
4 1 3 1
5 1 4 1
6 2 0 0
7 2 1 1
8 2 2 1
9 2 3 1
10 2 4 1
这似乎使用了“ open_hrs”中所有值的组合。 我认为问题在于未传递“行”是该行的值。
我要寻找的是:
dow hour open
<int> <int> <dbl>
1 1 0 0
2 1 1 1
3 1 2 1
4 1 3 1
5 1 4 0
6 2 0 0
7 2 1 0
8 2 2 0
9 2 3 1
10 2 4 1
我也尝试过使用sapply(),但没有成功。
谢谢。
答案 0 :(得分:0)
当您尝试检查hour
是否存在于您的单独列表中时:
hour %in% unlist(open_hrs[ dow ])
dow
被视为df_hours
的整个列。 (运行unlist(open_hrs[df_hours$dow])
以了解我的意思)。您可以通过逐行执行此操作来实现目标,但是更好的方法是执行group_by
来检查open_hrs
列表中的每个元素,如下所示:>
df_hours %>%
group_by(dow) %>%
mutate(open = ifelse(hour %in% unlist(open_hrs[dow]), 1, 0))
# A tibble: 10 x 3
# Groups: dow [2]
dow hour open
<int> <int> <dbl>
1 0 0
1 1 1
1 2 1
1 3 1
1 4 0
2 0 0
2 1 0
2 2 0
2 3 1
2 4 1
(如果您有不希望进行分组的后续操作,请不要忘记取消分组!)