Установите параметры для нескольких read.table () для идентичных файлов в качестве переменной - PullRequest
0 голосов
/ 25 мая 2019

Я часто нахожусь в ситуации, когда у меня есть несколько файлов с одинаковой структурой, но разным содержимым, что в итоге приводит к появлению уродливых и повторяющихся read.table() строк. Например:

df1 <- read.table("file1.tsv", fill = T, header = T, stringsAsFactors = F, quote = "", sep = "\t")
df2 <- read.table("file2.tsv", fill = T, header = T, stringsAsFactors = F, quote = "", sep = "\t")
df3 <- read.table("file3.tsv", fill = T, header = T, stringsAsFactors = F, quote = "", sep = "\t")
df4 <- read.table("file4.tsv", fill = T, header = T, stringsAsFactors = F, quote = "", sep = "\t")

Есть ли способ сохранить параметры как переменную или как-то установить значение по умолчанию, чтобы избежать этой повторяемости? (Возможно, нет, и в последнее время я пишу слишком много Python).

Наивно я пытался

read_parameters <- c(fill = T, header = T, stringsAsFactors = F, quote = "", sep = "\t")
df1 <- read.table("file1.tsv", read_parameters)

но это выдает ошибку Error in !header : invalid argument type.

В качестве альтернативы я мог бы запустить цикл для каждого из файлов, но я никогда не узнал, как итеративно именовать фреймы данных в цикле в R, и в любом случае я думаю, что, возможно, ответ на этот вопрос будет полезен для сообщество, как мне кажется, это обычная ситуация?

1 Ответ

0 голосов
/ 25 мая 2019

Вы можете написать функцию-обертку для таблицы чтения и установить параметры по умолчанию так, как вам нужно

my.read.table <- function(temp.source, fill = T, header = T, stringsAsFactors = F, quote = "", sep = "\t")
{
 return(read.table(temp.source, fill = fill, header = header, stringsAsFactors = stringsAsFactors, quote = quote, sep = sep))
}

Чем вы можете вызвать эту функцию просто

df <- my.read.table("file1.tsv")

или вы можете использовать lapply для вызова одной и той же функции для каждой строки-источника.

sources.to.load <- c("file1.tsv", "file2.tsv", "file3.tsv")
df_list <- lapply(sources.to.load, read.table, fill = T, header = T, stringsAsFactors = F, quote = "", sep = "\t")

Edit: Если вы также хотите сохранить метод вектора параметров, вы можете добавить его в свою функцию-оболочку.

my.read.table2 <- function(temp.source, fill = T, header = T, stringsAsFactors = F, quote = "", sep = "\t", parameterstring)
{
 if(exists("parameterstring"))
 {
  fill <- as.logical(parameterstring[1])
  header <- as.logical(parameterstring[2])
  stringsAsFactors <- as.logical(parameterstring[3])
  quote <- parameterstring[4]
  sep <- parameterstring[5] # if you need this to be more "strict" about the parameternames in the supplied vector: sep <- parameterstring[which(names(parameterstring) == "sep"))]
 }
 return(read.table(temp.source, fill = fill, header = header, stringsAsFactors = stringsAsFactors, quote = quote, sep = sep))
}

Чем вы можете вызвать эту функцию просто

df <- my.read.table2("file1.tsv") # this will call the function with the default settings
df2 <- my.read.table2("file1.tsv", parameterstring = read_parameters) # this will overwrite the default settings by the parameters stored in read_parameters
...