R:逐步填充向量

时间:2016-09-28 14:29:12

标签: r vector

我正在尝试编写一个简短的函数来分配值,并根据另一个向量中的值逐步填充向量。 例如,如果我有一个二进制数a = [0,1,1,0,1],我想创建一个长度与a相同的向量b,如果a [1] = 0则赋值x ,如果a [1] = 1,则为y。所以b = [0.4,0.6,0.6,0.4,0.6]

我做到了:

a<-sample(0:1,20,replace=T)

    assign<-function(x){
  c<-vector()
  for (i in 1:length(x)){
    ifelse (x[[i]]>0,b<-0.6,b<-0.4)
  c[[length(c)+1]]=b}
  return (b)
}

但是

assign(a)

仅返回第一个作业。我假设我没有正确嵌套循环?

2 个答案:

答案 0 :(得分:3)

当您声明您的向量a是二进制时,您可以将其转换为索引向量并使用该“属性”:

bfroma <- function(x) c(0.4, 0.6)[x+1]

a <- c(0, 1, 1, 0, 1)
bfroma(a)
#[1] 0.4 0.6 0.6 0.4 0.6

答案 1 :(得分:2)

对您的代码的一些评论:

  1. 不建议ifelse (x[[i]] > 0, b <- 0.6, b <- 0.4); ifelse未被用作此项(您最好再次检查?ifelse)。使用b <- ifelse (x[[i]] > 0, 0.6, 0.4)
  2. 我认为您需要return(c)而不是return(b);
  3. 使用不同的函数名称assign将掩盖R的内置函数名称。
  4. 无论如何,我认为整个功能可以用

    代替
    function (x) ifelse(x > 0, 0.6, 0.4)
    

    function (x) {x <- 0.4; x[x > 0] <- 0.6; x}
    

    对于输入向量严格为0-1二进制的特定情况,我们可以做得更好。 Cath已经指出,仅通过索引:

    function (x) c(0.4, 0.6)[x + 1L]
    

    更一般地说,只要x是离散的,我们就可以使用match来获取位置索引并使用快速替换,但我不会在这里详细说明。