基于其他向量的向量创建和修改

时间:2011-11-22 12:43:52

标签: r vector if-statement

我想让代码更有效率。

该示例创建一个向量(称为“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条件。

如何避免循环并使用隐式方法进行向量运算呢?

2 个答案:

答案 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