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