【问题标题】:ifelse data.table multiplication while keeping NA values as realifelse data.table 乘法,同时保持 NA 值真实
【发布时间】:2014-07-25 22:48:49
【问题描述】:

我已经尝试了这两种解决方案 Replacing all missing values in R data.table with a value,但我找不到 tmpd

library(data.table)
set.seed(10)
datatmps <- data.table(ID = seq(11), A = c(0.32, sample(1:40, 10,)), B = c(NA, 4.3, 
32.21, -0.9832, NA, 45, 3, 2, 90, 109.3, NA), C = c(sample(1:30, 10,), -0.87))
setkey(datatmps, ID)
for (i in seq_along(datatmps)) set(datatmps, i=which(is.na(datatmps[[i]])), j=i, 
value=NA_real_)
tmpd <- datatmps[, lapply(.SD, function(x) {
ifelse(x < 62.276, 6.107799961 + x * (0.4436518521 + x * (0.01428945805 + x * 
(0.0002650648471 + x * (0.000003031240396 + x * (0.00000002034080948 + x *  
0.00000000006136820929))))), 
-296.901212123675 + 16.9015967001546 * x - 0.302242100380422 * x^2 + 
0.00264123776535373 * x^3)}), by = key(datatmps)]

# Error in `[.data.table`(datatmps, , lapply(.SD, function(x) { : 
# Column 2 of result for group 2 is type 'double' but expecting type 'logical'. 
# Column types must be consistent for each group.

需要对代码进行哪些更改才能使其正常工作?

谢谢。

【问题讨论】:

    标签: r data.table


    【解决方案1】:

    您需要另一个嵌套的ifelse 来处理NAs

    yourfun <- function(x) {
        ifelse(x < 62.276, 6.107799961 + x * (0.4436518521 + x * (0.01428945805 + x * 
        (0.0002650648471 + x * (0.000003031240396 + x * (0.00000002034080948 + x *  
        0.00000000006136820929))))), 
        -296.901212123675 + 16.9015967001546 * x - 0.302242100380422 * x^2 + 
        0.00264123776535373 * x^3)}
    
    tmpd <- datatmps[, lapply(.SD, function(x) ifelse(!is.na(x),yourfun(x),NA_real_)), by = key(datatmps)]
    

    【讨论】:

    • 谢谢 Mike,您建议的代码改进工作完美
    猜你喜欢
    • 1970-01-01
    • 2017-03-11
    • 1970-01-01
    • 2017-10-01
    • 2020-10-24
    • 2015-07-07
    • 2017-05-19
    • 2016-02-07
    • 2014-03-09
    相关资源
    最近更新 更多