2

我已经有一个变量,比如year,它是由

year <- seq(from=1790,to=1970,by=10) 

现在我想生成一个虚拟变量,比如z ,它在year=1940year=1950点取值为 1 ,在其他地方取值为 0 。我的方法对我来说看起来很尴尬,是

z <- rep(0,times=length(year))   # initialize z
z[year==1940|year==1950] <- 1  

现在我想知道是否有更好的方法,比如一次分配值,因为 z 的初始化实际上很耗时。

4

2 回答 2

5
z <- as.numeric(year %in% c(1940, 1950))

虽然我很好奇;对于所有实际目的,您所拥有的应该已经足够快了。

于 2013-06-27T15:05:12.440 回答
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

微基准测试结果:

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
于 2013-06-27T17:40:59.090 回答