嵌套 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")
我收集了一些在线行为数据,必须使用 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")