【问题标题】:Creating Dataframes through R For Loop通过 R For 循环创建数据框
【发布时间】:2020-03-05 02:45:51
【问题描述】:

对 R 来说还算新,因此欢迎任何指导。

目标:我正在尝试在一个简短的脚本中创建数百个数据框。它们遵循一种模式,所以我认为一个 For 循环就足够了,但 data.frame 函数似乎忽略了变量的变量性质,读取它的出现。这是一个例子:

# Defining some dummy variables for the sake of this example
dfTitles <- c("C2000.AMY", "C2000.ACC", "C2001.AMY", "C2001.ACC") 
Copes <- c("Cope1", "Cope2", "Cope3", "Cope4")
Voxels <- c(1:338)

# (Theoretically) creating a separate dataframe for each of the terms in 'dfTitles'   
for (i in dfTitles){
 i <- data.frame(matrix(0, nrow = 4, ncol = 338, dimnames = list(Copes, Voxels)))
}

# Trying an alternative method
for (i in 1:length(dfTitles))
 {dfTitles[i] <- data.frame(matrix(0, nrow = 4, ncol = 338, dimnames = list(Copes, Voxels)))}

这会导致创建一个名为“i”的数据框,在前者中,或者在后者的情况下创建一个 4 列表。有任何想法吗?谢谢!


可能不必要的背景信息:我们正在使用 fMRI 数据进行分析,该分析将运行刺激、大脑体素、大脑区域和参与者之间的相关性。我们正在关联整个矩阵,因此通过参与者 ID 和大脑区域将值(也称为 COPE)分成单独的数据帧将使下一步变得更加容易。在将数据加载并分类到一个大数据框中后,我已经尝试过下一步,这让我很头疼。

【问题讨论】:

  • 您声明的错误不可重现。仅将上面显示的 R 命令复制并粘贴到新的 R 会话中,然后编辑您的帖子(如果需要)。谢谢。 :)
  • 并修正长度的拼写:for (i in 1:length(dfTitles) {
  • 很抱歉;也不熟悉在 StackOverflow 上发帖。我认为我进行了必要的更正,但如果格式仍然古怪,请告诉我。
  • 没问题。 :) 你已经有两个答案了。希望其中一个或两个都能解决您的问题。

标签: r dataframe for-loop


【解决方案1】:
rm(list=ls)
dfTitles <- c("C2000.AMY", "C2000.ACC", "C2001.AMY", "C2001.ACC") 
Copes <- c("Cope1", "Cope2", "Cope3", "Cope4")
Voxels <- c(1:3)

# (Theoretically) creating a separate dataframe for each of the terms in 'dfTitles'   
nr <- length(Voxels)
nc <- length(Copes)
N <- length(dfTitles) # Number of data frames, same as length of dfTitles

DF <- vector(N, mode="list")

for (i in 1:N){
  DF[[i]] <- data.frame(matrix(rnorm(nr*nc), nrow = nr))
  dimnames(DF[[i]]) <- list(Voxels, Copes)
}

names(DF) <- dfTitles
DF[1:2]

$C2000.AMY
       Cope1     Cope2      Cope3      Cope4
1 -0.8293164 -1.813807 -0.3290645 -0.7730110
2 -1.1965588  1.022871 -0.7764960 -0.3056280
3  0.2536782 -0.365232  2.3949076  0.5672671

$C2000.ACC
       Cope1    Cope2      Cope3      Cope4
1 -0.7505513 1.023325 -0.3110537 -1.4298174
2  1.2807725 1.216997  1.0644983  1.6374749
3  1.0047408 1.385460  0.1527678  0.1576037

【讨论】:

  • 这很好用。非常感谢。如果您不介意我问:删除 'dimnames()' 并与 'matrix()' 分开命令是否有功能差异?
  • 您可以轻松地在 matrix 函数中使用 dimnames,就像在原始代码中一样。我认为我将其分开的原因是因为它最初不起作用。然后我意识到你把两个维度弄错了,我忘了把它放回去。
  • 啊,没问题!只是想签到。仍然了解 R 中良好的脚本礼仪。谢谢!
【解决方案2】:

在 for 循环中创建对象时,需要在循环的下一次迭代之前将它们保存在某个地方,否则会被覆盖。

处理这个问题的一种方法是在循环开始之前创建一个空的list 或带有c() 的向量,并附加循环每次运行的输出。

处理它的另一种方法是在继续循环的下一次迭代之前将对象分配给您的环境。

# Defining some dummy variables for the sake of this example
dfTitles <- c("C2000.AMY", "C2000.ACC", "C2001.AMY", "C2001.ACC") 
Copes <- c("Cope1", "Cope2", "Cope3", "Cope4")
Voxels <- c(1:338)

# initialize a list to store the data.frame output
df_list <- list()
for (d in dfTitles) {
  # create data.frame with the dfTitle, and 1 row per Copes observation
  df <- data.frame(dfTitle = d,
                   Copes = Copes)
  # append columns for Voxels
  # setting to NA, can be reassigned later as needed
  for (v in Voxels) {
    df[[paste0("Voxel", v)]] <- NA
  }
  # store df in the list as the 'd'th element
  df_list[[d]] <- df
  # or, assign the object to your environment
  # assign(d, df)
}
# data.frames can be referenced by name
names(df_list)
head(df_list$C2000.AMY)

【讨论】:

  • 这个脚本也很好用。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-30
  • 2020-07-18
  • 1970-01-01
  • 1970-01-01
  • 2014-03-31
相关资源
最近更新 更多