用于循环或创建函数以创建矩阵(或dataframe)和重命名列

用于循环或创建函数以创建矩阵(或dataframe)和重命名列,r,for-loop,R,For Loop,我试图生成几个新的矩阵,并用相同的操作重命名列和行,但变量值不同。下面是我以缓慢的方式编写的代码,我尝试使用for循环和函数来执行此操作,但找不到正确的方法 m0 <- 100 N <- 1 CS <- 10.141 S <- seq (7.72,12.56,0.807) t <- 15 per3 <- matrix(nrow = length(S)*N, ncol = t+1) for (i in 1:dim(per3)[1]) { for (j

我试图生成几个新的矩阵,并用相同的操作重命名列和行,但变量值不同。下面是我以缓慢的方式编写的代码,我尝试使用for循环和函数来执行此操作,但找不到正确的方法

m0 <- 100
N <- 1
CS <- 10.141 
S <- seq (7.72,12.56,0.807)
t <- 15 

per3 <- matrix(nrow = length(S)*N, ncol = t+1)
for (i in 1:dim(per3)[1]) {
  for (j in 1:t+1){
    per3 [,1] <- replicate (n = N, seq (7.72,12.56,0.807))
    per3 [i,j] <- round (abs (rnorm (1, mean = mean(per3[i,1]), sd = 0.2)),digits=3)
  }}
colnames(per3) <- c('physical','t1','t2','t3','t4','t5','t6','t7','t8','t9','t10','t11','t12','t13','t14','t15')
rownames(per3) <- c('S1','S2','S3','CS+','S5','S6')
per3 <- per3 [,-1]

per3_d = matrix(nrow = length(S)*N, ncol = t)
for (i in 1:dim(per3)[1]){
  for (j in 1:t){
    per3_d [i,j] <- abs (per3 [i,j] - 10.141) 
  }
}

g31 <- round (m0 * exp (-0.2 * per3_d),digits = 3)
g32 <- round (m0 * exp (-0.5 * per3_d),digits = 3)
g33 <- round (m0 * exp (-0.9 * per3_d),digits = 3)
g34 <- round (m0 * exp (-1.5 * per3_d),digits = 3)
g35 <- round (m0 * exp (-2 * per3_d),digits = 3)
colnames(g31) <- c('t1','t2','t3','t4','t5','t6','t7','t8','t9','t10','t11','t12','t13','t14','t15')
colnames(g32) <- c('t1','t2','t3','t4','t5','t6','t7','t8','t9','t10','t11','t12','t13','t14','t15')
colnames(g33) <- c('t1','t2','t3','t4','t5','t6','t7','t8','t9','t10','t11','t12','t13','t14','t15')
colnames(g34) <- c('t1','t2','t3','t4','t5','t6','t7','t8','t9','t10','t11','t12','t13','t14','t15')
colnames(g35) <- c('t1','t2','t3','t4','t5','t6','t7','t8','t9','t10','t11','t12','t13','t14','t15')

m0在您的示例中,您正在手动迭代。这是非常低效的。简化代码的一种方法是使用
for
循环进行迭代,如果您知道自己在做什么以及为什么要这样做,那么R中的循环没有什么错(我提到这一点是因为许多人不这么认为)。但是作为R用户,您应该特别熟悉
apply
函数系列


您能否提供
m0
per3\u d
,以便我们可以得到一个可复制的示例?第一次猜测
lappy(c(-0.2,-0.5,-0.9,-1.5,-2),函数(x){g是的,我刚刚用m0和per3_d编辑了我的问题。谢谢你的回答!请验证你的代码是否可以运行,并不是所有变量都在示例中定义。
S
N
t
真的很抱歉,我现在已经定义了问题中的所有变量,我猜部分
是针对(I in 1:dim(per)[1])
用于(1中的i:dim(per3)[1])
?非常感谢您的回答。我可以问一下我接下来应该做什么来命名它们为g31、g32、g33…并将它们作为单独的数据帧吗?我需要先取消列出它,对吗?您能解释一下为什么需要将它们作为单独的数据帧吗?很可能这不是必需的,但我编辑了答案以说明如何操作。很抱歉,这可能是一个单独的数据帧upid问题。我是R的初学者。我理解您在这里所做的是将g31~g35与lapply一起运行,并将它们作为一个列表。我现在不确定的是,当我需要单独使用g31~g35进行进一步的计算和绘图时,我应该做什么。使用单独的数据帧,我清楚如何执行以下操作。
res$g31
你可以像这样获得单独的df。如果你想在
env()
中使用
list2env(res,globalenv())
我现在得到了它,这真是一个愚蠢的错误。非常感谢你的耐心,我确实从中学到了很多。
sub1pd<-as.data.frame (per_d)
sub1p<-as.data.frame(per)
sub1g11 <- as.data.frame(g11)
sub1g12 <- as.data.frame(g12)
sub1g13 <- as.data.frame(g13)
sub1g14 <- as.data.frame(g14)
sub1g15 <- as.data.frame(g15)
sd <- c(0.2, 0.5, 0.9)
names(sd) <- paste("per", seq_along(sd), sep = "") 
res <- lapply(sd, function(x){ 
  per <- matrix(nrow = length(S)*N, ncol = t+1)
  for (i in 1:dim(per)[1]) {
    for (j in 1:t+1){
      per [,1] <- replicate (n = N, seq (7.72,12.56,0.807))
      per [i,j] <- round (abs (rnorm (1, mean = mean(per[i,1]), sd = x)),digits=3)
      colnames(per) <- paste(t, 1:ncol(per), sep = "")
      per <- as.data.frame (per)
    }
    }
}
)  
exps <- c(-0.2, -0.5, -0.9, -1.5, - 2)
names(exps) <- paste("g3", seq_along(exps), sep = "") #name the vactor

res <- lapply(exps, function(x){ #for each x element in the exps vector perform the function
  g <- round(m0 * exp (x * per3_d), digits = 3)
  colnames(g) <- paste("t", 1:ncol(g), sep = "") #avoid typing sequences which can be generated easily
  g <- as.data.frame(g)
  g
}
)  
list2env(res, globalenv())