我想让代码更有效率。
该示例创建一个向量(称为“new_vector”)。该'new_vector'的值基于if / else-conditions而改变,这些条件引用相同长度的三个其他向量的值。
如果满足条件,则使用来自其他向量之一的值更新'new_vector'的相应元素(在M_date的示例元素中写入new_vector)。
以下是示例代码:
new_vector<-c(9,9,9)
S_date<-c(1,1,as.Date('2010/08/01'))
V_date<-c(1,as.Date('2010/09/01'),1)
M_date<-c(2,as.Date('2010/07/01'),1)
for (i in 1:3) {
if ( (S_date[i]==1) & (V_date[i]==1 | M_date[i] < V_date[i]) ) {
new_vector[i]<-M_date[i]
}
}
示例的结果是:
> new_vector
[1] 2 14791 9
该示例已经过简化,实际上矢量更大,并且还有其他if / else条件。
如何避免循环并使用隐式方法进行向量运算呢?
答案 0 :(得分:2)
如果你编写没有[i]位的表达式,你会得到一个向量的真/假结果:
> S_date==1 & (V_date==1 | M_date < V_date)
[1] TRUE TRUE FALSE
将其分配给向量,并在new_vector中替换该结果:
> result = S_date==1 & (V_date==1 | M_date < V_date)
> new_vector[result]=M_date[result]
> new_vector
[1] 2 14791 9
这是一个相当普遍的模式。计算布尔向量,然后将这些匹配值替换为另一个向量中的相应值。
它起作用,因为结果的第三个元素中的FALSE值意味着new_vector[3]
没有被触及。
答案 1 :(得分:2)
使用ifelse而不是if:
new_vector<-c(9,9,9)
S_date<-c(1,1,as.Date('2010/08/01'))
V_date<-c(1,as.Date('2010/09/01'),1)
M_date<-c(2,as.Date('2010/07/01'),1)
vec <- ifelse((S_date==1) & (V_date==1 | M_date < V_date), M_date, new_vector)
vec
#[1] 2 14791 9
HTH