1

可能有一个基本的解决方法,但是作为 R 的新手,我一直没有找到它。

我有两个变量,V1(POSIXct)和 V2(数字)。如果 V2!=0,我想将 (10-V2) 秒添加到 V1

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

4 回答 4

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
于 2013-10-16T16:21:18.837 回答
3

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

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
于 2013-10-16T16:17:12.570 回答
2

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

于 2013-10-16T15:53:58.073 回答
2
library(data.table)
dt = data.table(df)

dt[V2 != 0, V1 := V1 + 10 - V2]
于 2013-10-16T16:21:43.890 回答