对于向量的不同元素,具有不同任务的For循环
我有以下向量:对于向量的不同元素,具有不同任务的For循环,r,for-loop,R,For Loop,我有以下向量: set.seed(1); v1 = rnorm(100, 40, 10) fun1 <- function(x){ x = x - 1 return(x) } fun2 <- function(x){ x = x * 10 return(x) } fun3 <- function(x){ x = x / 5 return(x) } 然后返回一个向量 事实证明,我真的不知道如何优雅地完成它。这里有两个没有循环的解决方案: v2 <- numeric(
set.seed(1); v1 = rnorm(100, 40, 10)
fun1 <- function(x){
x = x - 1
return(x)
}
fun2 <- function(x){
x = x * 10
return(x)
}
fun3 <- function(x){
x = x / 5
return(x)
}
然后返回一个向量
事实证明,我真的不知道如何优雅地完成它。这里有两个没有循环的解决方案:
v2 <- numeric(length(v1))
i1 <- c(1:20, 41:60)
i2 <- 21:40
i3 <- 61:100
v2[i1] <- fun1(v1[i1]); v2[i2] <- fun2(v1[i2]); v2[i3] <- fun3(v1[i3]);
v2b <- numeric()
v2b[c(i1,i2,i3)] <- c(fun1(v1[i1]), fun2(v1[i2]), fun3(v1[i3]))
identical(v2, v2b)
v2使用mapply
:
unlist(mapply(function(myFun, x) myFun(x),
myFun = list(fun1, fun2, fun1, fun3),
x = list(v1[1:20], v1[21:40], v1[41:60], v1[61:100])))
如果您可以为我们更新对特定子集使用特定函数的逻辑,那么我们可以使其更加自动化,而不是为myFun
和x
键入值,为什么您需要for循环?为什么不仅仅是result[1:20]@doviod我想创建一个新的向量,所以反复遍历现有向量并创建一个新向量是有意义的。我想我应该先创建一个空向量吗?一个友好的提示:您可以将函数定义简化为fun1@snoram伟大的提示!打字越少越好!谢谢,这是一个很好的解决方案。在我真正的问题中,我把数字分成了三种类型,因此它们显示为字符串(类型1:12.0324.99,类型2:12.34.6789,类型3:12.045687)。我想为每种类型应用不同的函数并将其转换为数字,并通过带一个“.”的数字和带两个“.”但分隔数字的字符数不同(2对4)来识别数字对于类型3,保持原样并转换为numeric@MIH你真正的功能是把不同格式的数字转换成数字?如果您发布实际代表您的数据的示例数据,那么您可能会得到更好的解决方案,可能使用正则表达式,而不是所有这些循环问题。
unlist(mapply(function(myFun, x) myFun(x),
myFun = list(fun1, fun2, fun1, fun3),
x = list(v1[1:20], v1[21:40], v1[41:60], v1[61:100])))