2016-10-31 2 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で

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

私は、私が作成した2つの基本的な例の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'で' participant'と 'Trial2'を.csvファイルのデータに取り入れたいと思っています – HansDieter88

+0

' list.files'呼び出しを調整しましたファイル名の代わりに完全なパスを指定します。そこから 'data $ file'カラムに必要な部分文字列を' substring'するだけです。 – 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()を使用して、この方法で1つの大きなデータフレームを作成することもできます。ちょうどmap()の代わりにそれを代用してください。

可能であれば、@ rosscovaのexample/adviceに従い、無名関数を避けるべきです。私にとっては、これはワンオフコードです。私はあなたがこれをもう一度使っていると思うし、このような使い方をするための個人的なパッケージを作ることを検討したいかもしれない。