r - 忽略 R 中示例函数中的 NA 值
问题描述
我试图忽略采样函数中的 NA 值。这与之前关于在 R 中的循环中使用开始和结束值进行采样的问题有关:在 R 中的循环中 使用开始和结束值进行采样。
mapply
我使用:找到了该问题的解决方案df[j,4] <- mapply(function(x, y) sample(seq(x, y), 1), df[j,"start"], df[j,"end"])
。我已经回到这个问题,但我在处理NA
价值观方面遇到了一些困难。通常我会尝试过滤掉和列中具有NA
值的行,但循环的其他部分引用将被删除的行。我已经检查过其他讨论使用或作为可能的解决方案的线程,但正如我所说,用值过滤掉行会导致我的代码中出现其他问题,我认为这没有参数,所以我试图看看是否有另一种解决方法。start
end
na.omit
na.rm
NA
sample
na.rm
我使用了与上一个问题相同的数据集,但NA
添加了一些值。我希望得到如下结果:
ID start end sampled
a 25 67 44
b 36 97 67
c 23 85 77
d 15 67 52
e 21 52 41
f NA NA NA
g 39 55 49
h 27 62 35
i 11 99 17
j 21 89 66
k NA NA NA
l 44 58 48
m 16 77 22
n 25 88 65
这是要使用的示例集:
structure(list(ID = c("a", "b", "c", "d", "e", "f", "g", "h",
"i", "j", "k", "l", "m", "n"), start = c(25, 36, 23, 15, 21,
NA, 39, 27, 11, 21, NA, 44, 16, 25), end = c(67, 97, 85, 67,
52, NA, 55, 62, 99, 89, NA, 58, 77, 88), sampled = c(NA, NA,
NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), class = c("spec_tbl_df",
"tbl_df", "tbl", "data.frame"), row.names = c(NA, -14L), spec = structure(list(
cols = list(ID = structure(list(), class = c("collector_character",
"collector")), start = structure(list(), class = c("collector_double",
"collector")), end = structure(list(), class = c("collector_double",
"collector")), sampled = structure(list(), class = c("collector_logical",
"collector"))), default = structure(list(), class = c("collector_guess",
"collector")), skip = 1), class = "col_spec"))
解决方案
一种简单的方法是检查 中的NA
值mapply
:
df$sampled <- mapply(function(x, y) if(is.na(x) || is.na(y)) NA else
sample(seq(x, y), 1), df$start, df$end)
或者因为这是使用j
索引行的较大循环的一部分:
df[j,4] <- mapply(function(x, y) if(is.na(x) || is.na(y)) NA else
sample(seq(x, y), 1), df[j,"start"], df[j,"end"])