我已经有一个变量,比如 year ,由
生成year <- seq(from=1790,to=1970,by=10)
现在我要生成一个虚拟变量,比如说 z ,它在 year = 1940 和 year = 1950 ,0到处都是。我的方法对我来说很尴尬,是
z <- rep(0,times=length(year)) # initialize z
z[year==1940|year==1950] <- 1
现在我想知道是否有更好的方法,比如一次分配值,因为z的初始化实际上是耗时的。
答案 0 :(得分:5)
z <- as.numeric(year %in% c(1940, 1950))
虽然我很好奇;你所拥有的应该已经足够快到达所有实际目的。
答案 1 :(得分:3)
实际上,使用|
似乎要快一点,虽然只有你的矢量更大才有意义:
> as.integer(year %in% c(1940, 1950))
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
> as.integer(year==1940 | year==1950)
[1] 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 0 0
Microbenchmark结果:
Unit: microseconds
expr min lq median uq max neval
as.integer(year %in% c(1940, 1950)) 4.004 4.733 5.097 5.461 103.752 1000
as.integer(year == 1940 | year == 1950) 1.820 2.185 2.548 2.912 9.829 1000