2011-11-22 86 views
0

我想使代码更高效。基于其他矢量的矢量创建和修改

该示例创建一个向量(称为'new_vector')。这个'new_vector'的值根据if/else条件改变,这些条件引用了另外三个相同长度的向量的值。

如果条件满足,则使用来自其他向量之一的值(在M_date的示例元素中写入new_vector)更新'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

如果你乱写的[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]未被触及。

+0

这工作得很好。谢谢! – John

+0

只是想补充一点,我明白你也提供了关于你的代码如何工作的解释。 – John

2

使用ifelse的,如果不是:

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

+0

感谢您的回答。您提供的示例代码也起作用。一般来说,如果我们不仅提供了代码,而且还说明了代码的工作原理,我认为这对社区是有帮助的。我尝试在代码中描述ifelse函数:该语句逐行比较条件是否为真。如果条件为真,则它将'M_date'的元素放入矢量'vec'中,否则它将从矢量'new_vector'中的元素放入'vec'中。 – John