2016-10-31 32 views
0

我設置了一個實驗,軟件保存每個參與者和相關試驗這種格式的原始數據:的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

您的預期產出是多少?你可以檢查'?basename' – akrun

+0

就我所見,它是'list.files()','substr()'和'cbind()'的組合。 –

回答

2

你可以嘗試這樣的事情增加對參與者和審判與全1列。您設置了一個函數來導入單個文件,並添加一個包含文件名的列。然後在文件列表中運行該功能。

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) 
+0

我的問題是文件名不包含那麼多相關的數據。相反,我想從文件路徑中提取數據並將其附加到該路徑末尾的文件中。因此,在'participant_0 \ Trial2 \ Trial2_001_midi_20161028_152813.csv.aborted'我想'參與者'和'Trial2'和這些列作爲來自.csv文件的數據 – HansDieter88

+0

我剛調整了'list.files'調用給出一個完整的路徑,而不僅僅是一個文件名。從那裏開始,這只是'substring'到你所需要的'data $ file'列的問題。 – rosscova

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的示例/建議,並儘可能避免使用匿名函數。對我而言,這是一次性代碼。我懷疑你會再次使用它,並且可能要考慮構建一個個人功能包來使用。