2016-12-05 11 views
0

у меня есть 88 Вкладка отделенных файлов, которые мне нужно импортировать в R.Список для dataframe с использованием имен в качестве значений столбца в R

Они названы «Study-1-12»

  • Исследования: название исследования
  • 1: Заголовок ID
  • [1] 2: экспериментальный день (1 или 2)
  • 1 [2]: исследование (1 или 2)

Данные в каждом из них выглядит как

START: dd.mm.yyy hh:mm:ss 

WAITING 3780 ms  REACTION 1230 ms 

WAITING 9700 ms  REACTION 377 ms 


WAITING 5538 ms  REACTION 310 ms 

WAITING 4599 ms  REACTION 361 ms 

WAITING 9579 ms  REACTION 338 ms 
END: dd.mm.yyy hh:mm:ss 

До сих пор я импортировал все из них в списке и кратко каждый из них, так что конечный результат представляет собой таблицу с двумя колонками «ожидания» и «реакция» и с одним средним значением.

# Load filepaths and names 
filepath <- list.files(path = "rawdata/", pattern = "*.dat", all.files = TRUE, full.names = TRUE) # Load full path 
filenames <- list.files(path = "rawdata/", pattern = "*.dat", all.files = TRUE, full.names = FALSE) # load names of files 

# load all files into list with named col headers 
ldf <- lapply(filepath, function(x) read_tsv(file = x, skip = 1, 
       col_names = c("waiting", "valueW", "ms", "ws", "reaction", "valueR", "ms1"))) 

names(ldf) <- filenames # rename items in list 

# select only relevant cols and do the math 
ldf <- lapply(ldf, function(x) x %>% 
       select(waiting, valueW, reaction, valueR) %>% 
       filter(waiting == "WAITING") %>% 
       summarise(waiting = mean(valueW), reaction = mean(valueR)) 
      ) 

Теперь то, что я хотел бы сделать, это создать фрейм данных с колонками на основе имени файла (как указано выше: изучение-1-12):

  • ID: первый 1
  • ехра: 1 или 2
  • пробы: 1 или 2
  • ожидания: значение из каждого кадра данных в списке
  • реакция: значение из каждого кадра данных в списке

Любой способ сделать это в R?

+2

Просьба представить небольшой воспроизводимый пример и ожидаемый выход – akrun

+0

SO ждет данных .. –

+0

Используйте 'bind_rows (СОЛ, .id =«Вкладка»)', а затем использовать 'mutate' для извлечения необходимой информации из 'tab', используя строковые манипуляции. – Axeman

ответ

1
library(purrr) 
library(stringi) 

fils <- list.files("~/Data/so", full.names=TRUE) 

fils 
## [1] "/Some/path/to/data/studyA-1-12" "/Some/path/to/data/studyB-30-31" 

map_df(fils, function(x) { 

    stri_match_all_regex(x, "([[:alnum:]]+)-([[:digit:]]+)-([[:digit:]])([[:digit:]])")[[1]] %>% 
    as.list() %>% 
    .[2:5] %>% 
    set_names(c("study_name", "subject_id", "experiment_day", "trial")) -> meta 

    readLines(x) %>% 
    grep("WAITING", ., value=TRUE) %>% 
    map(~scan(text=., quiet=TRUE, 
       what=list(character(), double(), character(), 
           character(), double(), character()))[c(2,5)]) %>% 
    map_df(~set_names(as.list(.), c("waiting", "reaction"))) -> df 

    df$study_name <- meta$study_name 
    df$subject_id <- meta$subject_id 
    df$experiment_day <- meta$experiment_day 
    df$trial <- meta$trial 

    df 

}) 
## # A tibble: 10 × 6 
## waiting reaction study_name subject_id experiment_day trial 
##  <dbl> <dbl>  <chr>  <chr>   <chr> <chr> 
## 1  3780  1230  studyA   1    1  2 
## 2  9700  377  studyA   1    1  2 
## 3  5538  310  studyA   1    1  2 
## 4  4599  361  studyA   1    1  2 
## 5  9579  338  studyA   1    1  2 
## 6  3780  1230  studyB   30    3  1 
## 7  9700  377  studyB   30    3  1 
## 8  5538  310  studyB   30    3  1 
## 9  4599  361  studyB   30    3  1 
## 10 9579  338  studyB   30    3  1 
+1

argh. забыл о правиле 2/1 в именах, когда я издевался над файлами данных, но это не должно умалять решение. – hrbrmstr

+0

Отлично! Я не был знаком с стрункой, спасибо, что буду исследовать ее дальше. – mariachi