可能有一个基本的解决方法,但对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
答案 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]