【发布时间】:2018-01-07 16:31:19
【问题描述】:
我有一大组数据,我想使用 R 中的 sample() 函数将它们以 12 个一组的形式重新排序,以生成可以用来执行排列测试的随机数据集。但是,此数据有 NA 字符,无法收集数据,我希望它们在数据被洗牌时保持在各自的原始位置。
在上一个问题的帮助下,我设法使用代码对 24 个值的单个向量的 NA 值周围的数据进行混洗:
example.data <- c(0.33, 0.12, NA, 0.25, 0.47, 0.83, 0.90, 0.64, NA, NA, 1.00, 0.42)
example.data[!is.na(example.data)] <- sample(example.data[!is.na(example.data)], replace = F, prob = NULL)
[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] 在各自的组中围绕它们的 NA 值分别洗牌。
我尝试将此解决方案应用于的代码如下:
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 是每个组的长度,不包括存储在向量中的NAs(上面的示例为actual.length <- c(9, 8))。
有人知道如何实现这一目标吗?
再次感谢您的帮助!
【问题讨论】:
-
把它放在一个数据框中,添加另一个指示分组的列(例如
c(rep('a', 12), rep('b', 12))),使用dplyr::group_by或data.table对每组数据进行操作。或者使用基础split和lapply。只需编写一个适用于一个组的函数并将其应用于所有组。
标签: r loops random permutation shuffle