r语言 - nans在将日志提取到大于0的数字时产生



我想在总资产上制作一个变量的日志变量。我确实喜欢:

`HRSdata2$h1logass <- (ifelse(HRSdata2$h1atotb > 0, log(HRSdata2$h1atotb), 0))`

我收到错误消息: In log(HRSdata2$h1atotb) : NaNs produced

我的数据集表明,我预测的日志(Na)时会得到Na,但是,为什么我会得到Nan?他们更加关心我。

还可以向我展示用于运行循环或其他智能方式以将日志应用于一堆列的代码吗?目前,这是我的(我知道)代码:

HRSdata2$h1logass <- (ifelse(HRSdata2$h1atotb > 0, log(HRSdata2$h1atotb), 0))
HRSdata2$h2logass <- (ifelse(HRSdata2$h2atotb > 0, log(HRSdata2$h2atotb), 0))
HRSdata2$h3logass <- (ifelse(HRSdata2$h3atotb > 0, log(HRSdata2$h3atotb), 0))
HRSdata2$h4logass <- (ifelse(HRSdata2$h4atotb > 0, log(HRSdata2$h4atotb), 0))
HRSdata2$h5logass <- (ifelse(HRSdata2$h5atotb > 0, log(HRSdata2$h5atotb), 0))
HRSdata2$h6logass <- (ifelse(HRSdata2$h6atotb > 0, log(HRSdata2$h6atotb), 0))
HRSdata2$h7logass <- (ifelse(HRSdata2$h7atotb > 0, log(HRSdata2$h7atotb), 0))
HRSdata2$h8logass <- (ifelse(HRSdata2$h8atotb > 0, log(HRSdata2$h8atotb), 0))
HRSdata2$h9logass <- (ifelse(HRSdata2$h9atotb > 0, log(HRSdata2$h9atotb), 0))
HRSdata2$h10logass <- (ifelse(HRSdata2$h10atotb > 0, log(HRSdata2$h10atotb), 0))

我基本上只需要学习如何循环浏览可变名称。

进行 ifelse(x > 0, log(x), 0)时,r计算 log(x)

> x <- c(2, -1, 3)
> ifelse(x > 0, log(x), 0)
[1] 0.6931472 0.0000000 1.0986123
Warning message:
In log(x) : NaNs produced

但是,在结果您没有获得NaN,您可以获得与x <= 0相对应的值的0

ifelse语句等效于

ifelse(c(TRUE, FALSE, TRUE), c(log(2), log(-1), log(3)), c(0,0,0))

r不会删除第一个参数为 FALSE的第二个参数的值的计算。

我个人对ifelse有厌恶,而是倾向于使用两行代码来填充默认值,然后替代替代性。

要循环遍历所有列,您可以使用以下代码(我没有涉及它,因为没有数据)

for(i in 1:10){
    HRSdata2[,paste0('h',i,'logass')] <- 0
    w <- which(HRSdata2[,paste0('h',i,'atotb')] > 0)
    HRSdata2[w,paste0('h',i,'logass')] <-  HRSdata2[w,paste0('h',i,'atotb')]
}

此代码将为Na值输出零,如果不需要,则应替换:

w <- which(HRSdata2[,paste0('h',i,'atotb')] > 0)

with:

w <- which(HRSdata2[,paste0('h',i,'atotb')] > 0 | is.na( HRSdata2[,paste0('h',i,'atotb')] ) )

最新更新