添加时间(秒)以在另一个向量中的值的条件下选择大数据集中的单元格

时间:2013-10-16 15:49:56

标签: r time-series posixct

可能有一个基本的解决方法,但对R来说是新手,我找不到它。

我有两个变量,V1(POSIXct)和V2(数字)。如果V2!= 0

,我想向V1添加(10-V2)秒
df <- data.frame(V1=c(970068340, 970068350, 970068366, 970068376, 970068380, 
              970068394), V2= c(0,0,6,6,0,4))

我尝试了以下循环,但观察次数超过200万次,执行时间太长。这个问题有效吗?

for(i in 1:length(df$V2)) {  
    if (df$V2[i] != 0){  
   df$V1[i] = df$V1[i] + (10-df$V2[i])  
  }  
  }

为澄清起见,数据如下所示:

     V1     V2  
  970068340  0  
  970068350  0  
  970068356  6  
  970068366  6  
  970068370  0  
  970068384  4 

我希望将其转换为以下内容:

     V1      V2  
  970068340  0  
  970068350  0  
  970068360  6  
  970068370  6  
  970068370  0  
  970068390  4  

4 个答案:

答案 0 :(得分:3)

我将[用于子集,[<-用于替换。你可以用完全矢量化的操作来做到这一点(即使它看起来有些不整洁)。不使用data.table我会认为这将是base R中最快的方式......

rows <- df$V2 != 0
df[ rows , "V1" ] <- df[ rows , "V1" ] + 10 - df[ rows , "V2" ]
#         V1 V2
#1 970068340  0
#2 970068350  0
#3 970068370  6
#4 970068380  6
#5 970068380  0
#6 970068400  4

答案 1 :(得分:3)

另一种选择是:

transform(df,V1=V1+(10-V2)*as.logical(V2))
         V1 V2
1 970068340  0
2 970068350  0
3 970068370  6
4 970068380  6
5 970068380  0
6 970068400  4

答案 2 :(得分:2)

df$V1 = with(df, {V1 + ifelse(V2!=0,10-V2,0)})

答案 3 :(得分:2)

library(data.table)
dt = data.table(df)

dt[V2 != 0, V1 := V1 + 10 - V2]