R - 使用文件路径信息标记数据

时间:2016-10-31 11:08:09

标签: r

我正在设置一个实验,软件会以这种格式保存每个参与者和相关试验的原始数据:

participant_0\Trial1\Trial1_001_midi_20161028_152703.csv.aborted participant_0\Trial2\Trial2_001_midi_20161028_152813.csv.aborted ... participant_1\Trial1\... participant_1\Trial2\...

是否可以从文件路径中获取数据并将其作为列添加到我的数据框中,以便来自例如Trial1_001_midi_20161028_152703.csv.aborted的所有数据都包含具有参与者ID和试用的列?

> head(Trial1) X start_time_seconds end_time_seconds pitch velocity 1 0 12.23170 12.23270 42 127 2 1 16.11092 16.11192 42 127 3 2 20.09615 20.09715 42 127 4 3 24.11638 24.11738 42 88 5 4 28.10661 28.10761 42 120 6 5 30.08972 30.09072 42 116

我想为参与者和试用添加一个列,在此示例中为所有1

2 个答案:

答案 0 :(得分:2)

你可以尝试这样的事情。您设置了一个函数来导入单个文件,以及添加一个包含文件名的列。然后在文件列表中运行该功能。

path–"~/Desktop/ut"
library( readr )
files <- list.files( path = path, pattern = ".csv", full.names = T )

# set up a function to read a file and add a column for filename
import <- function( file ) {
    df <- read_csv( file, col_names = F )
    df$file <- file
    return( df )
}

# run that function across all files.
library( plyr )
data <- ldply( .data = files, .fun = import )

我在我创建的两个基本示例csv文件上运行此命令,输出如下所示:

> data

X1 X2 X3      file
1  a  6  5 ~/Desktop/ut/file1.csv
2  b  1  9 ~/Desktop/ut/file1.csv
3  c  3  1 ~/Desktop/ut/file2.csv
4  d  3  2 ~/Desktop/ut/file2.csv

然后,您可以以任何方式操纵该列。在您的示例中,数据框可能类似于以下内容:

data$file <- c( rep( "participant_0\\Trial1\\Trial1_001_midi_20161028_152703.csv.aborted", 2 ),
            rep( "participant_0\\Trial2\\Trial2_001_midi_20161028_152813.csv.aborted", 2 ) )

使用strsplit获取所需的部件。例如:

data$participant <- sapply( sapply( data$file, strsplit, split = '[\\]' ), "[", 1 )

data$trial <- sapply( sapply( data$file, strsplit, split = "[\\]" ), "[", 2 )

答案 1 :(得分:0)

考虑使用list.files()以编程方式获取列表;

之类的东西
fils <- list.files(recursive=TRUE)

(如果您的getwd()是您要开始搜索的地方。)

假设:

fils <- c("participant_0\\Trial1\\Trial1_001_midi_20161028_152703.csv.aborted",
          "participant_0\\Trial2\\Trial2_001_midi_20161028_152813.csv.aborted")

然后:

library(stringi)
library(purrr)

map(fils, function(x) {

  # read in your data, perhaps like this
  df <- read.csv(x)

  stri_split_regex(fils[1], "[\\._\\\\]")[[1]][-c(1,2,3,9,10)] %>% 
    setNames(c("trial", "field2", "field3", "date", "field5")) %>% 
    as.list() -> fields

  cbind(df, fields)  

})

它会为您提供数据框列表。

我使用的正则表达式分裂点,反斜杠和下划线,提供了丰富的字段来添加。我添加了所有内容,因为我不知道哪个是参与者ID(但我怀疑它是field5)。

我也不知道你是否需要在默认情况下使用因素(这是试验数据,所以你可能正在读取数据,假设字符串是因素)。因此,我没有包含将字符串保存为字符串的代码。

您也可以使用map_df()以这种方式从所有文件中制作一个大数据框。只需将其替换为map()来电。

你应该关注@ rosscova的例子/建议,如果可以,请避免使用匿名函数。对我来说,这是一次性代码。我怀疑你会再次使用它,并且可能想要考虑建立一个像这样使用的个人功能包。