我有四个向量:
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
用语言:
我遇到的问题是第2点。我怎样才能告诉R仅从给定元素而不是整个向量中采样:
这是我想看到的输出:
sample[1,2], sample[1,1], sample[2,2], b, b, b, a, a,b, sample[2,1]
答案 0 :(得分:1)
如果a == b
那么,sample
没有任何意义吗?因为a
和b
都相同?所以你会在同一个数字之间随机选择?!
我只是使用pmax
返回每个位置的最大元素:
pmax( a , b )
[1] 2 1 2 2 2 2 1 2 2 2
来自pmax
的帮助页面:
pmax
和pmin
将一个或多个向量(或矩阵)作为参数并返回单个向量,给出“并行”最大值(或最小)向量。结果的第一个元素是所有参数的第一个元素的最大值(最小值),结果的第二个元素是所有参数的第二个元素的最大值(最小值),依此类推。
这是用三个向量做你想做的事的一种方法(我刚刚写了这个例子,看到你用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)