我有一个这样的数据集:
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,其中包含来自var MEAN、MIN和MAX的模拟值的列表,但如果是MEAN <= MIN或MEAN >= MAX,则需要返回NA值。如下所示:
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,....我怎么才能得到这个呢?
发布于 2020-09-08 05:58:58
在这里,我们需要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此外,如果我们需要n NAs,只需在if中复制NA即可
if(z <= x | z >= y) rep(NA, 10000)https://stackoverflow.com/questions/63781614
复制相似问题