重新排序矢量时,将NA值保持在原始位置

时间:2017-07-31 12:17:07

标签: r permutation shuffle

我有一大组数据要使用R中的NA函数以12个为一组进行重新排序,以生成随机数据集,我可以使用该数据集进行排列测试。但是,此数据具有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) 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 随机调整所有其他值。例如,example.data是12个值的组合示例集:

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

适当的重新排序将是:

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)

有一种简单的方法吗?

感谢您的帮助!

这已经解决,但我有一个扩展问题

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

例如,从第一个示例扩展的向量:

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)} 在各自的群组中分别进行洗牌。

我尝试使用此解决方案的代码如下:

example.data

其中input.data是原始输入数据(nr); ns是组数(2),actual.length是每个样本的大小(12); actual.length <- c(9, 8)是每个组的长度,用于排除存储在向量中的NA(上例中的{{1}})。

再次感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

这是你在找什么?

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

答案 1 :(得分:1)

我们可以通过创建索引来尝试使用非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