如何在 R 中的每个循环迭代结束时创建新变量



我正在尝试创建一个变量,该变量是其他 4 个变量的函数。我有以下代码:

set.seed(123)
iter <- 1000
group <- c('A','B','C','D','E','F')
for (i in group) {
df <- df1[df1$group == i,]
x_ <- vector(mode="numeric", length=1000)
assign(eval(paste0("X_", i)), globalenv())   #This is the issue
a <- rnorm(iter, mean=df$a, sd=df$sea)
b <- rnorm(iter, mean=df$b, sd=df$seb)
c <- rnorm(iter, mean=df$c, sd=df$sec)
z <- rnorm(iter, mean=df$zbar, sd=df$se_z)
X_[i] = (a + c*(z-df$zbar))/(-b)
}

我无法创建一个唯一的特定于组的变量(例如 X_A、X_B、...(,并且我不确定为什么 -assign( (- 函数无法正常工作。数据帧df1有 6 行(每组一行(,然后列数等于变量数加上组的字符串变量。我并没有试图将这些新变量X_[i]附加到数据集中,我只是试图将其放置在全局环境中。我相信问题在于我分配变量的位置,但它没有生成数值变量 X。

df1是一个数据帧,其中包含 9 个变量的 6 个观测值,其中包含a, sea, b, seb, c, sec, zbar, se_z。这些分别只是 a、b、c 和 z 的平均值和标准差。第 9 个变量是group它包含 A、B、...、F。当我使用代码df <-df1[df1$group == i,]时,我正在尝试为每个组实体创建一个唯一的X变量。

尝试这样的事情:

dynamicVariableName <- paste0("X_", i)
assign(dynamicVariableName, (a + c*(z-df$zbar))/(-b))

或者,除了@ErrorJordan的答案,你可以像这样编写循环:

set.seed(123)
iter <- 1000
group <- c('A','B','C','D','E','F')
for(i in group)
{
df <- df1[df1$group == i,]
a <- rnorm(iter, mean=df$a, sd=df$sea)
b <- rnorm(iter, mean=df$b, sd=df$seb)
c <- rnorm(iter, mean=df$c, sd=df$sec)
z <- rnorm(iter, mean=df$zbar, sd=df$se_z)
X <- (a + c*(z-df$zbar))/(-b)
assign(paste0("X_",i),X,.GlobalEnv)
}

正如@MrFlick所建议的,您还可以将数据存储到列表中,为此,您只需修改循环即可获得:

set.seed(123)
iter <- 1000
group <- c('A','B','C','D','E','F')  
X = vector("list",length(group))
names(X) = group
for(i in 1:length(group))
{
df <- df1[df1$group == group[i],]    
a <- rnorm(iter, mean=df$a, sd=df$sea)
b <- rnorm(iter, mean=df$b, sd=df$seb)
c <- rnorm(iter, mean=df$c, sd=df$sec)
z <- rnorm(iter, mean=df$zbar, sd=df$se_z)
X[[i]] <- (a + c*(z-df$zbar))/(-b)
}

DF1 数据帧

df1 = data.frame(a = c(1:6),
b = c(1:6),
c = c(1:6),
zbar = c(1:6),
sea = rep(1,6),
seb = rep(1,6),
sec = rep(1,6),
se_z = rep(1,6),
group = group)

解析你想做什么有点困难,但我假设它是这样的

对于group中的每个值,创建一个对象(在全局环境中(称为X_AX_B,...

对于其中每个对象,为其分配值(a + c*(z-df$zbar))/(-b)

我认为这应该为您做到这一点:

set.seed(123)
group <- c('A','B','C','D','E','F')
for (i in group) {
df <- df1[df1$group == i,]
a <- rnorm(iter, mean=df$a, sd=df$sea)
b <- rnorm(iter, mean=df$b, sd=df$seb)
c <- rnorm(iter, mean=df$c, sd=df$sec)
z <- rnorm(iter, mean=df$zbar, sd=df$se_z)
assign(paste0("X_", i), (a + c*(z-df$zbar))/(-b), globalenv())
}

请注意,在您提供的代码示例中,命令iter <- 1000不起作用,命令x_ <- vector(mode="numeric", length=1000)也不起作用。我的意思是,你制作了这些对象,但随后永远不会在任何进一步的计算中使用它们。如果这些命令应该做一些有意义的事情,我需要你帮助解释它们的预期目的。

最新更新