嵌套 for 循环递增的问题

Issue with nested for loop incrementing

我收集了一些在线行为数据,必须使用 R 对其进行分析。下载数据时,除了日期之外,没有每个参与者的唯一标识符。因为我正在分析所有数据,所以我编写了一个 for 循环,将所有 CSV 合并到一个数据框中,我想添加一个 'participant' 列,每个加载的文件递增 1(例如 pp1 , pp2, pp3).这是我目前所拥有的:

OnExpDir = dir()
#Files begin with "PARTICIPANT" but no ID
OnExpList=grep("PARTICIPANT", OnExpDir, value = T)

#Binding data to one table
OnExpData=NULL
for(myfile in OnExpList)
{
  fullExpFileName = paste(getwd(), "/", myfile, sep = "")
  TMPData = read.csv(fullExpFileName, header = T, stringsAsFactors = T)
  #Attempting to add a participant ID
  for(i in 1:length(OnExpList))
  {
    TMPData$pp[i] = paste("pp",i)
  }
  OnExpData = rbind(OnExpData, TMPData)
}

产生以下结果:

|---------------------|------------------|
|         data        |        pp        |
|---------------------|------------------|
|          data1      |         pp1      |
|---------------------|------------------|
|          data2      |         pp2      |
|---------------------|------------------|
|          data3      |         pp3      |
|---------------------|------------------|
|          data1      |         pp1      |
|---------------------|------------------|
|          data2      |         pp2      |
|---------------------|------------------|
|          data3      |         pp3      |
|---------------------|------------------|

然而,这不是我想要的。它应该更符合:

|---------------------|------------------|
|         data        |        pp        |
|---------------------|------------------|
|          data1      |         pp1      |
|---------------------|------------------|
|          data2      |         pp1      |
|---------------------|------------------|
|          data3      |         pp1      |
|---------------------|------------------|
|          data1      |         pp2      |
|---------------------|------------------|
|          data2      |         pp2      |
|---------------------|------------------|
|          data3      |         pp2      |
|---------------------|------------------|

等等

如果解释不清楚,我深表歉意。如果有人能帮助我理解我的代码有什么问题,我将不胜感激。提前谢谢你。

您可以使用:

OnExpData <- do.call(rbind, Map(function(x, y) transform(read.csv(x), 
                      pp = paste0('pp', y)), 
                      paste0(getwd(), "/", OnExpList), seq_along(OnExpList)))

或使用 purrr 中的 map_df 更短:

purrr::map_df(paste0(getwd(), "/", OnExpList), read.csv, .id = "pp")