如何使用for循环简化代码?

时间:2019-08-09 06:40:35

标签: r loops for-loop

我不确定如何使用for循环简化下面的代码,以减少混乱。

我曾尝试使用函数来循环代码,但对我而言不起作用。

group1 <- c(2,4,1,2,5,5,6,3,7,11)
group2 <- c(54,2,12,21,1,7,8,3,6,11)
group3 <- c(31,2,5,7,9,41,14,5,8,1)


vector1 <- c()
for(j in 1:3){
  x <- c()
  for(i in seq(j,length(group1),2)){
    x[i] <- group1[i]
  }
  vector1[j] <- mean(x,na.rm=TRUE)
}


vector2 <- c()
for(j in 1:3){
  y <- c()
  for(i in seq(j,length(group2),2)){
    y[i] <- group2[i]
  }
  vector2[j] <- mean(y,na.rm=TRUE)
}


vector3 <- c()
for(j in 1:3){
  z <- c()
  for(i in seq(j,length(group3),2)){
    z[i] <- group3[i]
  }
  vector3[j] <- mean(z,na.rm=TRUE)
}

All.vector <- as.numeric(cbind(vector1,vector2,vector3))

我希望循环在向量数量方面能够变得灵活。这意味着有时它可能只有vector1和vector2,有时需要有vector1,vector2和vector3取决于我拥有的组数。

2 个答案:

答案 0 :(得分:0)

您可以将组存储在data.frame或列表中,然后使用lapply替换循环。为此,您不需要现在有多少个组,它只需遍历所有列即可。

my_df <- data.frame(group1, group2, group3)

all_vec <- lapply(my_df, function(x) {
  vapply(1:3, FUN = function(j) mean(x[seq(j, length(x), 2)], na.rm = TRUE), FUN.VALUE = numeric(1))
})

unlist(all_vec)
# group11 group12 group13 group21 group22 group23 group31 group32 group33 
# 4.20    5.00    4.75   16.20    8.80    6.75   13.40   11.20    9.00 

详细说明
让我们一步一步地看一下您的第一个循环。

vector1 <- c()

您可以对向量进行初始化,但是对于性能而言,最好告诉R期望有多少个元素。因此,最好写

vector1 <- numeric(3)

您的x在循环内也是如此,但是如果通过设置

进行内部循环,我们可以摆脱这种情况
x <- group1[seq(j,length(group1),2)]

代替

  x <- c()
  for(i in seq(j,length(group1),2)){
    x[i] <- group1[i]
  }

使用vapply替换外循环

vector1 <- vapply(1:3, FUN = function(j) mean(group1[seq(j, length(group1), 2)], na.rm = TRUE), 
                 FUN.VALUE = numeric(1))

现在,我们将此vapply函数应用于带有my_df的data.frame lapply的每一列。这将返回包含结果的每一列的列表。使用unnest将列表平整为向量。

答案 1 :(得分:0)

您的意思是这样吗?

vector1 <- c()
for(j in 1:3){
  x <- c()
  for(i in seq(j,length(group1),2)){
    x[i] <- group1[i]
    y[i] <- group2[i]
    z[i] <- group3[i]
  }
  vector1[j] <- mean(x,na.rm=TRUE)
  vector2[j] <- mean(y,na.rm=TRUE)
  vector3[j] <- mean(y,na.rm=TRUE)
}