我正在设置一个实验,软件会以这种格式保存每个参与者和相关试验的原始数据:
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
答案 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的例子/建议,如果可以,请避免使用匿名函数。对我来说,这是一次性代码。我怀疑你会再次使用它,并且可能想要考虑建立一个像这样使用的个人功能包。