使用column的值获取单独列表的元素(在mutate()调用中)

时间:2018-10-31 03:36:44

标签: r dplyr

我试图使用连续两列中的值来本质上在单独列表中的集合中进行查找。

下面是一个代码段:

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(),但没有成功。

谢谢。

1 个答案:

答案 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

(如果您有不希望进行分组的后续操作,请不要忘记取消分组!)