【问题标题】:Keep NA values in their original position when reordering vector重新排序向量时将 NA 值保持在其原始位置
【发布时间】:2017-07-31 12:17:06
【问题描述】:

我有一大组数据,我想使用 R 中的 sample() 函数以 12 个一组的形式重新排序,以生成可以用来执行排列测试的随机数据集。但是,此数据具有无法收集数据的NA 字符,我希望它们在数据被洗牌时保持在各自的原始位置。

目前,NAs 与所有其他值随机混排。例如,其中 example.data 是一个由 12 个值组成的示例集:

example.data <- c(0.33, 0.12, NA, 0.25, 0.47, 0.83, 0.90, 0.64, NA, NA, 1.00, 0.42)

sample(example.data, replace = F, prob = NULL)

[1] 0.64  0.83  NA  0.33  0.47  0.90  0.25  NA  0.12  0.42  1.00  NA

而合适的重新排序是:

[1] 0.64  0.83  NA  0.33  0.47  0.90  0.25  0.12  NA  NA  0.42  1.00

有没有简单的方法来做到这一点?

感谢您的帮助!

这已经解决了,但我有一个延伸的问题

由此扩展,如果我有一组长度为 24 的数据,我将如何分别重新排序第一组和第二组 12 个值?

例如,从第一个例子扩展而来的向量:

example.data <- c(0.33, 0.12, NA, 0.25, 0.47, 0.83, 0.90, 0.64, NA, NA, 1.00, 0.42, 0.73, NA, 0.56, 0.12, 1.0, 0.47, NA, 0.62, NA, 0.98, NA, 0.05)

example.data[1:12]example.data[13:24] 在各自的组中分别随机播放。

我尝试将此解决方案应用于的代码如下:

shuffle.data = function(input.data,nr,ns){
simdata <- input.data
  for(i in 1:nr){
    start.row <- (ns*(i-1))+1
    end.row   <- start.row + actual.length[i] - 1
    newdata = sample(input.data[start.row:end.row], size=actual.length[i], replace=F)
    simdata[start.row:end.row] <- newdata
  }
  return(simdata)}

其中 input.data 是原始输入数据 (example.data); nr 是组数(2),ns 是每个样本的大小(12); actual.length 是每个组的长度,不包括存储在向量中的 NA(上例中的 actual.length &lt;- c(9, 8))。

再次感谢您的帮助!

【问题讨论】:

  • 每个帖子一个问题,拜托。如果您有新问题,请发布新问题。 (你当然可以从这个链接到新的,反之亦然)

标签: r permutation shuffle


【解决方案1】:

这就是你要找的吗?

example.data[!is.na(example.data)] <- sample(example.data[!is.na(example.data)], replace = F, prob = NULL)

【讨论】:

  • 这正是我所追求的,非常感谢。我认为有一种方法可以添加一个在重新排序中排除 NA 值的参数。我正在尝试 sample(example.data[example.data !=NA]),这显然不是正确的处理方式,因为它返回了 12 个 NA 的向量。
【解决方案2】:

我们可以通过创建索引来尝试使用非 NA 元素

i1 <- which(!is.na(example.data))
example.data[i1] <- example.data[sample(i1)]
example.data
#[1] 0.25 0.64   NA 0.83 0.12 1.00 0.42 0.47   NA   NA 0.33 0.90

【讨论】:

  • 我尝试了 Pauline 的建议,效果非常好,但这也符合我的预期。谢谢你的建议!
  • @Roald 是同样的方法。唯一的问题是我提前 1 秒左右发布了
  • 我确实看到了,我只是想让你知道,我也很欣赏你的建议,而且它并没有被忽视。
猜你喜欢
  • 1970-01-01
  • 2020-09-23
  • 2021-01-29
  • 2019-04-02
  • 2018-01-07
  • 1970-01-01
  • 1970-01-01
  • 2021-10-15
  • 2018-02-01
相关资源
最近更新 更多