R使用随机样本转换二进制数据

时间:2015-05-16 02:28:31

标签: r

如何转换二进制数据

1  0  1  1  0  0  0
0  1  0  1  0  1  1
1  1  1  0  1  0  1

以此格式提供数据:

1 0.95  2 0.32  3 0.89  4 0.97  5 0.11  6 0.20 7 0.31
1 0.11  2 0.92  3 0.34  4 0.94  5 0.21  6 0.90 7 0.81
1 0.97  2 0.82  3 0.89  4 0.17  5 0.96  6 0.13 7 0.91

这样: 每个值代表两位数:

1-整数表示其位置,

如果原始值= 1,则<{2>浮点值从0.70 to 0.99随机给出,

如果原始值=零,则从0.10 to 0.39

我知道如何生成随机样本,即

x <- 1:7
y <- sample(seq(0.70, 0.99,by=0.01),length(x),replace=FALSE) 

但我不知道如果X == 1从0.70 to 0.99生成随机样本值,如何告诉R,否则会从0.10 to 0.39生成随机样本值

2 个答案:

答案 0 :(得分:3)

mm成为您的样本输入矩阵

mm <- matrix(c(1, 0, 1, 1, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 1, 1, 1, 
0, 1, 0, 1), ncol=7)

您可以使用

生成正确的整数序列
idx <- col(mm)

您可以使用ifelse()

生成随机数
val <- ifelse(mm==1, 
    runif(length(mm), .7, .99), 
    runif(length(mm), .1, .39))
从技术上讲,我们确实生成了一些我们不会使用的数字,但它通常足够快以至于没有问题。最后,我们可以将它们与

结合起来
matrix(rbind(idx, val), nrow=3)

#      [,1]  [,2] [,3]  [,4] [,5]  [,6] [,7]  [,8] [,9] [,10] [,11] [,12] [,13] [,14]
# [1,]    1 0.734    2 0.707    3 0.214    4 0.246    5 0.822     6 0.919     7 0.887
# [2,]    1 0.150    2 0.353    3 0.332    4 0.724    5 0.768     6 0.936     7 0.304
# [3,]    1 0.708    2 0.321    3 0.790    4 0.193    5 0.808     6 0.224     7 0.872

答案 1 :(得分:1)

您可以使用ifelse有条件地选择runif范围:

set.seed(144)
t(apply(dat, 1, function(x) rbind(seq(length(x)),
                                  ifelse(x == 1, runif(length(x), 0.7, 0.99),
                                         runif(length(x), 0.1, 0.39)))))
#      [,1]      [,2] [,3]      [,4] [,5]      [,6] [,7]      [,8] [,9]     [,10] [,11]
# [1,]    1 0.7143302    2 0.1225158    3 0.9107380    4 0.8452873    5 0.1519741     6
# [2,]    1 0.1081755    2 0.7156656    3 0.2653289    4 0.8529043    5 0.3622948     6
# [3,]    1 0.8798000    2 0.7516552    3 0.8467378    4 0.2338804    5 0.7888522     6
#          [,12] [,13]     [,14]
# [1,] 0.2599710     7 0.1423132
# [2,] 0.8107819     7 0.7807105
# [3,] 0.3009073     7 0.7231688

ifelse语句在使用两个不同范围绘制的runif个向量之间进行选择,rbind对索引和随机数进行交错。