这是我尝试编码的R问题的一个小小的预告片。
让我们说你桌子上有15根蜡烛。根据蜡烛是否已经点亮,您将在三个不同的回合中点亮给定的蜡烛或将它们放出。因此,如果给定的蜡烛已经点亮,那么您的行动就是将其推出。另一方面,如果蜡烛没有点亮,那么你的动作就是点亮它。
最初没有蜡烛点亮。
首先,你会点亮每一秒蜡烛,所以蜡烛数字2到14。
其次,你会点亮/熄灭每三个蜡烛。
最后,你会点亮/熄灭每五个蜡烛。
最后,我想知道哪些蜡烛点亮了。
我用两个变量创建了一个数据框。蜡烛的数量和二进制变量,说明蜡烛是否点亮。
我可以使用三个不同的if语句手动解决这个问题,但我想用更少的代码来完成。关于我如何做的任何建议?
答案 0 :(得分:4)
这似乎有效。
candles <- vector(mode="logical", length=15)
for(i in c(2,3,5)){
candles[1:15 %% i == 0] <- !candles[1:15 %% i == 0]
}
which(candles)
## 2 3 4 5 8 9 14
感谢Gregor建议对代码进行一些简化
答案 1 :(得分:3)
虽然@Alex提出了一个解决方案,但另一种方式(我认为)将重复采用集合的对称差异:
sym_diff <- function(x, y) union(setdiff(x, y), setdiff(y, x))
set1 <- seq(2, 14, 2)
set2 <- seq(3, 15, 3)
set3 <- c(5, 10, 15)
sort(sym_diff(sym_diff(set1, set2), set3))
[1] 2 3 4 5 8 9 14
我们还可以使用%>%
包中的magrittr
(管道)运算符来使代码更清晰,更易于理解:
library(magrittr) # load %>%
# use the %>% for cleaner code
set1 %>%
sym_diff(set2) %>%
sym_diff(set3) %>%
sort()
[1] 2 3 4 5 8 9 14