2

我有四个向量:

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

乙: [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 的第一个元素:返回 a
  2. 如果 c 的第一个元素等于 d 的第一个元素,则在 a 和 b 之间随机选择
  3. 如果 c 的第一个元素小于 d 返回 b
  4. 从 1 到 10 对每个元素重复。

我遇到的问题是第 2 点。如何告诉 R 仅从给定元素而不是整个向量中采样:

这是我想看到的输出:

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

2 回答 2

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
于 2013-09-10T09:08:45.187 回答
0

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

pswitch <- function(x,...) diag(sapply(x,switch,...))
pswitch(sign(c-d)+2,b,ifelse(runif(10)>.5,a,b),a)
于 2013-09-10T13:53:44.017 回答