我正在尝试编写一个简短的函数来分配值,并根据另一个向量中的值逐步填充向量。 例如,如果我有一个二进制数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)
仅返回第一个作业。我假设我没有正确嵌套循环?
答案 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)
对您的代码的一些评论:
ifelse (x[[i]] > 0, b <- 0.6, b <- 0.4)
; ifelse
未被用作此项(您最好再次检查?ifelse
)。使用b <- ifelse (x[[i]] > 0, 0.6, 0.4)
。return(c)
而不是return(b)
; assign
将掩盖R的内置函数名称。无论如何,我认为整个功能可以用
代替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
来获取位置索引并使用快速替换,但我不会在这里详细说明。