我想在一个循环中向现有向量添加一个计算值,在循环中从循环中调用所需向量。即我正在寻找一些类似于assign()函数的函数,但这将使我能够将值添加到现有变量而不创建新变量。
例如: 说我有3个变量:
sp=3
for(i in 1:sp){
name<-paste("sp",i,sep="")
assign(name,rnorm(5))
}
现在我想访问每个变量标题中的最后一个值,加倍并将该数据库添加到向量中:
for(i in 1:sp){
name<-paste("sp",i,sep="")
name[6]<-name[5]*2
}
这里的问题是“name”是一个字符串,R如何将其识别为可靠的名称并访问它?
答案 0 :(得分:2)
你要求的是这样的:
get(name)
在你的代码中它会这样:
v <- 1:10
var <- "v"
for (i in v){
tmp <- get(var)
tmp[6] <- tmp[5]*2
assign(var, tmp)
}
# [1] 1 2 3 4 5 10 7 8 9 10
这对你有什么帮助吗?
但是,我同意另一个答案,列表和lapply / sapply函数更适合!
答案 1 :(得分:1)
这是使用列表执行此操作的方法:
int main() {
char* rebecca = concat("rebecca", 1);
char* bill = concat("bill", 2);
Write(rebecca); /* bill2ca1 */
Write(bill); /* bill2ca1 */
}
然后,您可以按sp=3
mylist <- vector(mode = "list", length = sp) #initialize a list
names(mylist) <- paste0("sp",seq_len(sp)) #set the names
for(i in 1:sp){
mylist[[i]] <- rnorm(5)
}
for(i in 1:sp){
mylist[[i]] <- c(mylist[[i]], mylist[[i]][5] * 2)
}
mylist
#$sp1
#[1] 0.6974563 0.7714190 1.1980534 0.6011610 -1.5884306 -3.1768611
#
#$sp2
#[1] -0.2276942 0.2982770 0.5504381 -0.2096708 -1.9199551 -3.8399102
#
#$sp3
#[1] 0.235280995 0.276813498 0.002567075 -0.774551774 0.766898045 1.533796089
中所述访问列表元素,即help("[")
,mylist$sp1
等。
当然,这仍然是非常低效的代码,并且可以进行很多改进。例如,由于所有三个变量具有相同的类型和长度,它们实际上应该组合成一个矩阵,可以通过一次调用填充mylist[["sp1"]]
,这也可以允许使用矢量化操作进行第二次操作。
答案 2 :(得分:0)
@Roland是绝对正确的,你绝对应该使用列表来解决这类问题。它更干净,更容易使用。这是处理你所拥有的另一种方式(可以很容易地推广):
sp <- replicate(3, rnorm(5), simplify=FALSE)
names(sp) <- paste0("sp", 1:3)
sp
#$sp1
#[1] -0.3723205 1.2199743 0.1226524 0.7287469 -0.8670466
#
#$sp2
#[1] -0.5458811 -0.3276503 -1.3031100 1.3064743 -0.7533023
#
#$sp3
#[1] 1.2683564 0.9419726 -0.5925012 -1.2034788 -0.6613149
newsp <- lapply(sp, function(x){x[6] <- x[5]*2; x})
newsp
#$sp1
#[1] -0.3723205 1.2199743 0.1226524 0.7287469 -0.8670466 -1.7340933
#
#$sp2
#[1] -0.5458811 -0.3276503 -1.3031100 1.3064743 -0.7533023 -1.5066046
#
#$sp3
#[1] 1.2683564 0.9419726 -0.5925012 -1.2034788 -0.6613149 -1.3226297
编辑:如果你是真的,真诚地致力于这样做,尽管另有建议,你可以这样做:
for(i in 1:sp){
name<-paste("sp",i,sep="")
assign(name, `[<-`(get(name), 6, `[`(get(name), 5) * 2))
}