我不确定如何使用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取决于我拥有的组数。
答案 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)
}