具有从特定向量元素采样的ifelse条件

时间:2013-09-10 09:00:37

标签: r

我有四个向量:

a <- sample(1:2,10,replace=T)
b <- sample(1:2,10,replace=T)
c <- sample(4:5,10,replace=T)
d <- sample(4:5,10,replace=T)

我想将c的每个元素与d中的相应元素进行比较,并执行以下操作:

ifelse(c>d,a,ifelse(c==d,SAMPLE(a,b),replace=T),b)

a:[1] 1 1 2 2 2 1 1 2 1 2

b:[1] 2 1 2 1 2 2 1 2 2 1

c:[1] 4 4 4 4 4 4 5 5 4 4

d:[1] 4 4 4 5 5 5 4 4 5 4 用语言:

  1. 如果c的第一个元素大于d的第一个元素:return a
  2. 如果c的第一个元素等于d的第一个元素,则在a和b之间随机选择
  3. 如果c的第一个元素小于d return b
  4. 从1到10重复每个元素。
  5. 我遇到的问题是第2点。我怎样才能告诉R仅从给定元素而不是整个向量中采样:

    这是我想看到的输出:

    sample[1,2], sample[1,1], sample[2,2], b, b, b, a, a,b, sample[2,1]
    

2 个答案:

答案 0 :(得分:1)

如果a == b那么,sample没有任何意义吗?因为ab都相同?所以你会在同一个数字之间随机选择?!

我只是使用pmax返回每个位置的最大元素:

pmax( a , b )
[1] 2 1 2 2 2 2 1 2 2 2

来自pmax的帮助页面:

  

pmax pmin 将一个或多个向量(或矩阵)作为参数并返回单个向量,给出“并行”最大值(或最小)向量。结果的第一个元素是所有参数的第一个元素的最大值(最小值),结果的第二个元素是所有参数的第二个元素的最大值(最小值),依此类推。

由于OP

的新信息而进行编辑

这是用三个向量做你想做的事的一种方法(我刚刚写了这个例子,看到你用4发布了一些东西)。这种方法很容易转换为您更新的OP,我将让您了解如何。在发布通过RNG生成的数据时,最好指定种子,以便有人可以重现您的载体。

set.seed(1234)
a <- sample( 2 , 10 , repl = T ); b <- sample( 2 , 10 , repl=T ); c <- sample(5 , 10 , repl = T )
#a
#[1] 1 2 2 2 2 2 1 1 2 2
#b
#[1] 2 2 1 2 1 2 1 1 1 1
#c
#[1] 2 2 1 1 2 5 3 5 5 1

#  Empty output vector
out <- rep( NA , length( a ) )

#  Fill elements where a does not equal b with the pmax value of a or b
out[ a != b ] <- pmax( a[ a != b ] , b[ a != b ] )

#  Indicies where a == b 
ind <- a == b

#  Fill elements where a == b with a random choice of a or c for that element
set.seed(1)
out[ ind ] <- cbind( a[ind] , c[ind] )[ cbind( seq_len( sum( ind ) ) , sample( 2 , sum( ind ) , repl = TRUE ) ) ]
#[1] 2 2 2 2 2 5 3 1 2 2

答案 1 :(得分:0)

我只是在修补,但是这个怎么样:

pswitch <- function(x,...) diag(sapply(x,switch,...))
pswitch(sign(c-d)+2,b,ifelse(runif(10)>.5,a,b),a)