如何在R中操作这些文件名?

时间:2018-06-12 13:43:41

标签: r csv

我目前正在处理许多.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),其中行的顺序保留了导入顺序?

在我获得此表单中的数据后,我知道如何处理它,我不知道如何从文件标题中提取此信息,然后如何存储它。

4 个答案:

答案 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"