2016-04-19 7 views
0

В течение нескольких недель я измерял данные один раз в неделю. Поскольку измерительный прибор использовался в другом месте между мной, теперь я получил немало .csv-Файлов, которые я прочитал в R и получил их сейчас в своей рабочей области. Я назвал их одинаковыми, так что все data.frames содержат шаблон «11.». в их имени переменной. Я знаю, что могу получить список (только) этих имен переменных с помощьюR: Поместите переменные из .GlobalEnv, которые соответствуют определенным критериям в списке

ls(pattern = "11.") 

Но я хочу иметь list, содержащий те data.frames. Конечно, я мог бы вернуться в свой сценарий и изменить команду read.table, например.

A.11.01 <- read.table(...) 

в

data.list[1] <- read.table(...) 

, а затем изменить имя элемента списка data.list[1] к «A.11.01» (и спасло бы хорошее количество времени, если бы я сделал это сразу), и я Я уверен, что я мог бы также узнать, как это сделать, и называть элемент списка только одной командой, но кажется, что есть довольно простой способ позволить R создать этот список вообще.

(Другой подход, который я попытался был data.list[1] <- .GlobalEnv[1], но я в конечном итоге, не найдя способа подмножества в environment. (Мои другие подходы, кажется, глупо быть упомянуты вообще.))

ответ

1

Вы можете использовать

mylist <- mget(ls(pattern = "11.")) 

или, если вы хотите, чтобы убедиться, что вы получите только data.frame с с этим шаблоном (не другие объекты), вы можете использовать

mylist <- Filter(is.data.frame, mget(ls(pattern = "11."))) 

Кстати, в вашей ситуации, это было бы легко читать их в список напрямую, используя что-то вроде

listfiles <- list.files("path/to/folder", pattern = "\\.csv$", full.names=TRUE) 
mylist <- lapply(listfiles, read.csv, stringsAsFactors = FALSE) 

(stringsAsFactors = FALSE это просто пример, чтобы показать вам, что вы можете легко добавить другие аргументы)

+0

Btw особой благодарности за трюк для чтения в нескольких таблицах в списке на одном время! – mattu

1

Вы можете сделать это по-разному, компьютерное время дешевле человеческого времени, поэтому было бы разумнее использовать lapply на вектор имен файлов, как предложено docendo discimus.

Но опять же, это легко конвертировать .GlobalEnv в список, а затем подмножество его, скажем, с помощью grep:

gelist <- as.list(.GlobalEnv) 
# or ... as.list(environment()) 
gelist <- gelist[grep("^11\\.", names(gelist))] 
#^saying that expected pattern is at the beginning of the string 
# and . has a special meaning for grep, so it has to be "escaped" by \\ 
# see ?regexp