【问题标题】:Random samples from each column of a data.frame containing NAs来自包含 NA 的 data.frame 每一列的随机样本
【发布时间】:2015-10-19 00:38:34
【问题描述】:

这是this question 的后续行动。我想从data.frame 的每一行中独立于其他行抽取随机样本。 data.frame 可能包含给定 data.frame df 中给出的 NA。

set.seed(12345)
df1 <- c(rnorm(n=4, mean=0, sd=1), NA)
df2 <- rnorm(n=5, mean=10, sd=1)
df <- rbind(df1, df2)

t(apply(df, 1, sample, replace=TRUE))

         [,1]     [,2]       [,3]     [,4]    [,5]
df1 0.5855288       NA -0.1093033 0.709466      NA
df2 9.7238159 9.723816  8.1820440 9.723816 10.6301

从第一行我想选择四个带有替换的观察值(非空列),从第二行我想选择五个带有替换的观察值(非空列),独立于第一个选择。但是我给定的代码从第一行中选择了五个带有替换的观察值,从第二行中选择了五个带有替换的观察值。

【问题讨论】:

  • 是的,你是绝对正确的@akrun。
  • 或许lst &lt;- apply(df, 1, function(x) sample(x[!is.na(x)], replace=TRUE));do.call(rbind,lapply(lst, length, max(lengths(lst))))
  • 感谢@akrun 的有用评论。你介意改变你的评论来回答吗?
  • 我用新代码更新了帖子。

标签: r random statistics sample


【解决方案1】:

我猜你想sample 只使用非 NA 值。在这种情况下,!is.na 可用于删除 NA 值,然后我们 sample 删除剩余值。输出将是 list ('lst'),因为 sample 之后的每一行的元素数量不同(4 和 5)。

  lst <- apply(df, 1, function(x) sample(x[!is.na(x)], replace=TRUE))

如果我们需要将list 重新转换为matrix,我们可以在末尾附加“NA”以使每个list 元素的长度相同,然后使用rbind 将其转换回matrix.

  do.call(rbind,lapply(lst, `length<-`, max(lengths(lst))))

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-12
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2014-11-05
    • 2020-09-08
    相关资源
    最近更新 更多