首页 > 解决方案 > 根据 r 中的条件使用 Map 函数获取 NA 列表

问题描述

我有一个这样的数据集:

library(data.table)
library(EnvStats)

DT <- data.table(MEAN = c(0.5,0.7,0.9,0.8),MIN = c(0.4,0.6,0.8,0.8),MAX = c(0.6,0.8,1,0.8),REF = rnorm(4,1000,200))

我计算了一个 var ,其中包含来自 vars 的模拟值列表,MEAN但我需要返回 NA 值 if或 。像这样的东西:MINMAXMEAN <= MINMEAN >= MAX

DT[, Sim_rtri := Map(function(w, x, y, z) ifelse(z <= x | z >= y,NA,w*(1+rtri(n = 10000,min = x,max = 
y,mode = z))), REF, MIN, MAX, MEAN)]

但是在所有情况下我都得到一个只有一个值的输出。像这样:

 DT
    MEAN MIN MAX       REF Sim_rtri
 1:  0.5 0.4 0.6 1274.1917 1957.572
 2:  0.7 0.6 0.8  887.0604 1503.418
 3:  0.9 0.8 1.0 1072.6257 2011.683
 4:  0.8 0.8 0.8 1126.5725       NA

相反,我想要的输出是:

DT
    MEAN MIN MAX       REF                                                Sim_rtri
 1:  0.5 0.4 0.6 1274.1917 1946.223,1849.996,1933.170,1940.845,1905.784,1943.204,...
 2:  0.7 0.6 0.8  887.0604 1512.938,1530.315,1480.203,1542.298,1500.740,1513.961,...
 3:  0.9 0.8 1.0 1072.6257 2055.113,2085.123,1991.335,2022.209,2010.288,1984.313,...
 4:  0.8 0.8 0.8 1126.5725 NA, NA, NA, NA, NA,....

我怎样才能得到这个?

标签: rdata.table

解决方案


在这里,我们需要if/else而不是ifelse要求ifelse所有参数具有相同的长度,rtri n显然很大并且与test向量的长度不同,length因为我们在每一行上循环时为 1

DT[, Sim_rtri := Map(function(w, x, y, z) if(z <= x | z >= y) NA 
            else(w*(1+rtri(n = 10000,min = x,max = 
 y,mode = z))), REF, MIN, MAX, MEAN)]
DT
#   MEAN MIN MAX      REF                                                  Sim_rtri
#1:  0.5 0.4 0.6 1292.650 1894.088,1943.958,1935.992,1881.802,1918.530,1975.114,...
#2:  0.7 0.6 0.8 1037.545 1817.918,1742.029,1719.068,1753.283,1786.834,1803.231,...
#3:  0.9 0.8 1.0 1204.405 2327.954,2306.122,2198.317,2223.934,2235.752,2328.857,...
#4:  0.8 0.8 0.8  881.633                                                        NA

此外,如果我们需要nNA,只需复制NAinif

if(z <= x | z >= y) rep(NA, 10000)

推荐阅读