【问题标题】:Import multiple csv using loop pattern in different subdirectories在不同的子目录中使用循环模式导入多个 csv
【发布时间】:2019-12-14 10:54:40
【问题描述】:

我正在为 R 编写一个带有 BID 文件格式(脑成像数据结构)的脚本。我需要能够使用通用格式,其中一部分路径代表另一个变量:

subj=VARIABLE
t1s${subj}=read.csv("./sub-${subj}/ses-1/beh/*task-navon*")

这应该可以工作,以便用户可以在我们收集主题编号时导入它们,然后使用脚本将该主题读入 df。然后,我将继续“争吵”数据,继续使用 $subj 编号来执行添加列列出 subj 之类的操作。数字重复与​​df长度相同的次数(从另一个函数打印到变量等)。

脚本中使用的示例文件:

t1s10001=read.csv("./sub-10001/ses-1/beh/sub-10001_ses-1_task-navon_beh.csv")
t1s10002=read.csv("./sub-10002/ses-1/beh/sub-10002_ses-1_task-navon_beh.csv")
t1s10003=read.csv("./sub-10003/ses-1/beh/sub-10003_ses-1_task-navon_beh.csv")

奖励:: 如果你知道如何做到这一点,那么 subj 可以有多个输入

即:

insert subject numbers:
10001 10002 10003

因此 $subj 数字被保存到 $1 $2 $3 $4 个空格中并自动循环通过导入过程(以及脚本的其余部分)

【问题讨论】:

  • 查看pastesprintfglue::glue。也许将它与list.files(..., full.names=TRUE) 一起使用。
  • glue 很有趣,但它不会让我在另一个变量名(我可以弄清楚)中使用上述任何内容,因为我正在尝试使用 t1s${subj}。胶水('t1s{subj}') 打印正确的输出,但胶水('t1s{subj}')= read.csv 不起作用。如果我将整行放在胶水中,它会打印正确的输出,但不会运行 read.csv 命令。

标签: r loops csv variables


【解决方案1】:

这是一个可能的解决方案,使用 map 然后 split 读取 CSV 文件并将它们作为数据框存储在列表中。

# test.csv files are saved within directories names 'sub1', 'sub2', etc.
d <- data.frame(filename=list.files(pattern = '.csv',full.names = T,recursive = T),
                stringsAsFactors = F)

         filename
1 ./sub1/test.csv
2 ./sub2/test.csv
3 ./sub3/test.csv

# read in CSV files and create subject ID var from filename
dd <- d %>% mutate(data=map(filename,~read_csv(.)),
                   subject=str_split(filename,'/',simplify = T)[,2])

# split dataframe to a list, with subject ID as the name of each element
setNames(split(dd,seq(nrow(dd))),dd$subject)

$sub1
         filename               data subject
1 ./sub1/test.csv this, is, my, data    sub1

$sub2
         filename               data subject
2 ./sub2/test.csv this, is, my, data    sub2

$sub3
         filename               data subject
3 ./sub3/test.csv this, is, my, data    sub3

或者,如果您正在阅读的所有 CSV 文件都具有相同的格式,您可以unnest() 文件来创建一个包含所有主题的大型数据框。

d %>% mutate(data=map(filename,~read_csv(.)),
                   subject=str_split(filename,'/',simplify = T)[,2]) %>% 
  unnest()
         filename subject    a  b  c    d
1 ./sub1/test.csv    sub1 this is my data
2 ./sub2/test.csv    sub2 this is my data
3 ./sub3/test.csv    sub3 this is my data

【讨论】:

  • 最佳解决方案奏效了!如果其他人这样做,我添加了一行来使用 BID 格式。在“dd”变量之后,执行ddd=dd %&gt;% mutate(subject=str_split(subject,'-',simplify=T)[,2]),然后将文件设置为files=setNames(split(ddd,seq(nrow(ddd))),ddd$subject)。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-04-27
  • 1970-01-01
  • 2013-12-03
  • 2018-12-14
  • 2020-04-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多