R语言循环If语句

时间:2015-06-15 07:21:32

标签: r

我有一个6列和4.5百万行的数据集。我想写一个逻辑检查,如果在第五列中有值为零,则在第六列中放置1。你能解释一下如何构建算法来做到这一点吗?在第五列中,我发现我的单元格值为零。我想执行如果在第五列中我有零值将1放在第六列中,如果不放0?

3 个答案:

答案 0 :(得分:2)

您可以使用ifelse功能:

df[,6] = ifelse(df[,5] == 0, 1, df[,6])

或者没有ifelse:

df[,6] <- as.integer(df[,5] == 0)

其中df是您的data.frame。

只要第5列不为0,第二种方法就会将0放入第6列,否则为1。

答案 1 :(得分:1)

尝试

 library(data.table)#v1.9.5+
 setDT(df1)[(!V5), V6:=1]

如果您需要基于'V5'的'V6'的二进制值

 setDT(df1)[, V6:= as.integer(!V5)]

基准

 set.seed(246)
 df2 <- as.data.frame(matrix(sample(0:5, 6*1e7, replace=TRUE), ncol=6))
 df3 <- copy(df2)
 df4 <- copy(df2)

system.time(df2[,6] <- ifelse(df2[,5] == 0, 1, df2[,6]))
# user  system elapsed 
#  1.455   0.146   1.604 


system.time(`<-`(df3[,6][!df3[,5]],1))
# user  system elapsed 
 # 0.085   0.022   0.108 

system.time(setDT(df4)[(!V5), V6:=1])
 #user  system elapsed 
 # 0.054   0.007   0.060 

修改

编辑后,似乎第二个选项是OP需要的选项。时间是

system.time(df3[,6] <- as.integer(df3[,5] == 0))
 #  user  system elapsed 
 # 0.099   0.008   0.110 
system.time(setDT(df2)[, V6:= (!V5)+0L])
#   user  system elapsed 
# 0.039   0.005   0.047 

library(microbenchmark)
microbenchmark(akrun=setDT(df2)[, V6:= (!V5)+0L],
  fmarm= df3[,6] <- as.integer(df3[,5]==0), unit='relative', times=20L)
#Unit: relative
#  expr      min       lq     mean   median       uq    max neval cld
# akrun 1.000000 1.000000 1.000000 1.000000 1.000000 1.0000    20  a 
# fmarm 2.546095 2.525371 2.490122 2.516731 2.411705 2.4011    20   b

数据

 set.seed(384)
 df1 <- as.data.frame(matrix(sample(0:5, 6*20, replace=TRUE), ncol=6))

答案 2 :(得分:1)

为什么不简单:

`<-`(df[,6][!df[,5]],1)