我目前正在处理许多.csv文件,其名称格式为“sim_data_L_m.csv”,其中L和m是两个实验参数。
我编写了以下代码将所有csv文件导入到R中的数据框中,然后将所有这些数据框放入一个列表中以便于索引。
#Load all .csv in directory into list
dataFiles <- list.files(pattern="*.csv")
N <- length(dataFiles)
dataList <- vector("list",N)
j <- 1
for(i in dataFiles) {
#read all of the csv files
name = gsub("-",".",i)
name = gsub(".csv","",name)
i = paste(".\\",i,sep="")
assign(name,read.csv(i, header=T))
#add to dataList
dataList[[j]] = assign(name,read.csv(i, header=T))
j = j+1
}
但是,我最近发现我需要从标题名称中提取L和m参数。有没有办法让我从文件名中取出L和m,并将它们添加到另一个有两列的数据框中(一个用于L,一个用于m),其中行的顺序保留了导入顺序?
在我获得此表单中的数据后,我知道如何处理它,我不知道如何从文件标题中提取此信息,然后如何存储它。
答案 0 :(得分:2)
nombreContactoVenta: {
required: function() {
if($("#apellidoContactoVenta").val() || $("#emailContactoVenta").val() || $("#telefonoContactoVenta").val())
{
return true;
}
else return false;
}
},
telefonoContactoVenta: {
required: function() {
if($("#apellidoContactoVenta").val() || $("#emailContactoVenta").val() || $("#nombreContactoVenta").val())
{
return true;
}
else return false;
}
}
函数可以解决问题。请注意,您可能需要调整以下strsplit
:
c(3,4)
答案 1 :(得分:0)
我究竟如何做到这一点取决于名称的确切构成和模式,但这应该相当灵活。
dataFiles <- c("sim_data_1_9.csv", "sim_data_2_5.csv", "sim_data_3_9.csv")
dataFiles <- sub(".csv$", "", dataFiles)
param <- strsplit(dataFiles, "_")
param <- t(sapply(param, tail, 2))
colnames(param) <- c("L", "m")
data.frame(param)
# L m
# 1 1 9
# 2 2 5
# 3 3 9
答案 2 :(得分:0)
您现在所拥有的并不是一种非常类似于管理数据的方式。使用 tidyverse 包,可以将每个CSV加载到嵌套数据框中,然后将数据扩展为具有额外列的单个数据集以进行标记。出于演示目的,我假装“sim_data_L_m.csv”的内容是mtcars数据集:
library(tidyverse)
data.master <- tibble(fname = list.files(pattern = '*.csv')) %>%
separate(fname, into = c('sim', 'data', 'param1', 'param2', 'ext'), remove = F) %>%
select(-sim, -data, -ext) %>%
mutate(data = map(fname, function(x) read.csv(x)))
这将创建一个“tibble”嵌套数据框,类似于:
# A tibble: 1 x 4
fname param1 param2 data
<chr> <chr> <chr> <list>
1 sim_data_L_m.csv L m <data.frame [32 x 11]>
最后,使用unnest()
将展开“数据”列并在所有其他列中重复标记,从而创建单个统一数据框:
data.master <- unnest(data.master, data)
# A tibble: 32 x 14
fname param1 param2 mpg cyl disp hp drat wt qsec vs am gear carb
<chr> <chr> <chr> <dbl> <int> <dbl> <int> <dbl> <dbl> <dbl> <int> <int> <int> <int>
1 sim_data_L_m.csv L m 21.0 6 160.0 110 3.90 2.620 16.46 0 1 4 4
2 sim_data_L_m.csv L m 21.0 6 160.0 110 3.90 2.875 17.02 0 1 4 4
3 sim_data_L_m.csv L m 22.8 4 108.0 93 3.85 2.320 18.61 1 1 4 1
4 sim_data_L_m.csv L m 21.4 6 258.0 110 3.08 3.215 19.44 1 0 3 1
5 sim_data_L_m.csv L m 18.7 8 360.0 175 3.15 3.440 17.02 0 0 3 2
6 sim_data_L_m.csv L m 18.1 6 225.0 105 2.76 3.460 20.22 1 0 3 1
7 sim_data_L_m.csv L m 14.3 8 360.0 245 3.21 3.570 15.84 0 0 3 4
8 sim_data_L_m.csv L m 24.4 4 146.7 62 3.69 3.190 20.00 1 0 4 2
9 sim_data_L_m.csv L m 22.8 4 140.8 95 3.92 3.150 22.90 1 0 4 2
10 sim_data_L_m.csv L m 19.2 6 167.6 123 3.92 3.440 18.30 1 0 4 4
# ... with 22 more rows
答案 3 :(得分:0)
如果您可以使用正则表达式和单独的包使用stringr
:
install.packages('stringr');
library(stringr);
您可以使用str_match
匹配和提取特定组(和嵌套的子组),例如:
match <- str_match(c("sim_data_L_m.csv"), "(sim_data_(.*)_(.*))\\.csv");
name <- gsub("-", ".", match[1,2]);
L <- match[1,3];
m <- match[1,4];
match
包含每个输入字符串的行和匹配组的列第一列是整个字符串,如果找不到匹配则包含NA
:
> match
[,1] [,2] [,3] [,4]
[1,] "sim_data_L_m.csv" "sim_data_L_m" "L" "m"