【问题标题】:Dynamically Name R Data Frame in a For Loop在 For 循环中动态命名 R 数据帧
【发布时间】:2018-03-09 17:20:21
【问题描述】:

我正在使用 For 循环根据某些规范创建 100 个数据集。我的最终目标是拥有一个包含每个迭代数据集的数据集(即数据集 1 到 100)。

我目前的解决方案不优雅。我将每个单独的数据框(称为数据集)导出到 csv,然后将它们合并到 R 之外。对于 For 循环的每次迭代 i,我的数据框都会被覆盖。

Trackfile=1:100
for (i in Trackfile){
  d.cor <- .10 # Desired correlation
  Dataset <- as.data.frame(mvrnorm(20, mu = c(0,0), 
                                   Sigma = matrix(c(1,d.cor,d.cor,1), ncol = 2), 
                                   empirical = TRUE))
  write.csv(Dataset, paste0("C:/",d.cor," ",i,".csv"))
}

我认为解决方案是根据迭代(i)动态命名数据框,使数据框命名为 dataset1、dataset2...dataset100,然后将它们合并。但是我一直在努力寻找一种动态命名嵌入在 For 循环中的数据帧的解决方案。我是R新手,请帮忙!

【问题讨论】:

  • “我相信解决方案是动态命名数据框”:不!请不要!初始化一个长度为 100 的空列表,将每个数据集依次放入列表中。然后可以在 R 中将它们组合成一个对象。不过,如何做到这一点取决于“合并”的含义。
  • 为什么不创建一个数据框并继续从for 循环向其中添加行。或者,您可以创建数据帧的列表/数组/向量。

标签: r for-loop dataframe dynamic naming


【解决方案1】:

R 可以轻松处理这个问题。这是一种方法,但可能需要根据您要对所有这些随机数据集执行的操作进行修改。这将构建一个包含 100 个标记为“data001”到“data100”的矩阵的列表:

library(MASS)
d.cor <- .10
DATA <- replicate(100,  mvrnorm(n=20, mu=c(0, 0), Sigma=matrix(c(1,
     d.cor, d.cor, 1), ncol=2), empirical=TRUE), simplify=FALSE)
names <- paste0("data", sprintf("%0003d", 1:100))
names(DATA) <- names
head(DATA[["data099"]])
#              [,1]         [,2]
#  [1,]  1.94086111  1.570299681
#  [2,] -0.74071651 -0.664948968
#  [3,] -1.02952487 -0.704650191
#  [4,]  0.85203916  0.698703243
#  [5,] -0.08673212  1.668412324
#  [6,]  0.88828524  0.001039757
save(DATA, file="AllData.RData")

此代码创建一个包含 100 个矩阵的列表并命名每个矩阵。您可以使用名称或编号DATA[["data099")]]DATA[[99]] 访问特定矩阵。它保存为“AllData.RData”,以便您可以使用load("AllData.RData") 检索它。根据您打算如何处理这些数据,一个列表可能比 100 个单独的文件更灵活。

【讨论】:

  • 这对 dcarlson 有效,非常感谢,谢谢! :) 感谢 joran 和 rnso 的 cmets。 rnso,您为我指明了正确的方向,我相信我有一个替代解决方案,发布在下面。大家干杯!
【解决方案2】:

感谢 rnso 为我指出了另一种解决方案:

trial=NULL
Trackfile=1:10
for (i in Trackfile){
  d.cor <- .10 # Desired correlation
  Dataset <- as.data.frame(mvrnorm(20, mu = c(0,0), 
                                   Sigma = matrix(c(1,d.cor,d.cor,1), ncol = 2), 
                                   empirical = TRUE))
  trial = rbind(trial, data.frame(Dataset$V1, Dataset$V2))
}
print(trial)
print(Dataset)

感谢 stackoverflow 社区。我真的很感激。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多