对于变量的每个值,仅选择包含列表中所有值的值。 R

问题描述 投票:0回答:1

我有一个包含许多列的大型数据集,包括周数(即 1、2、3)和工作日(“星期一”、“星期二”等)。有些周可能只有一两个工作日的数据。我只需要选择或标记具有“完整”数据的周,即至少一个星期一、星期二、星期三、星期四和星期五。

我尝试创建一个 for 循环,对于每个周数,将测试该周是否至少包含列表“工作日”中的每个元素之一。我创建了一个新专栏,将标记满足该要求的每周(此处为第一周)。但是,for 循环未按预期工作,因为返回的所有标志均为“0”,而我预计第 1 周为“1”。

week_num <- c(1,1,1,1,1,2,2,2,3,3,3,3)
day <- c("Monday", "Tuesday", "Thursday", "Wednesday", "Friday", "Friday", "Sunday", "Saturday", "Thursday", "Wednesday", "Tuesday", "Sunday")

reprex <- data.frame(cbind(week_num, day))

weekdays <- c("Monday", "Tuesday", "Wednesday", "Thursday", "Friday")

for (i in unique(reprex$week_num)){
  reprex$flag = if_else(all(reprex$day %in% weekdays), 1, 0)
}

提前感谢您的帮助;我认识到我错过了一些明显的事情/可能有更好的方法来做到这一点。干杯

r list for-loop vector
1个回答
0
投票

这是使用

dplyr
包的选项:

library(dplyr)

reprex |>
  mutate(flag = all(weekdays %in% day), .by = week_num)

输出

   week_num       day  flag
1         1    Monday  TRUE
2         1   Tuesday  TRUE
3         1  Thursday  TRUE
4         1 Wednesday  TRUE
5         1    Friday  TRUE
6         2    Friday FALSE
7         2    Sunday FALSE
8         2  Saturday FALSE
9         3  Thursday FALSE
10        3 Wednesday FALSE
11        3   Tuesday FALSE
12        3    Sunday FALSE
© www.soinside.com 2019 - 2024. All rights reserved.