2013-11-11 2 views
11

Я пытаюсь загрузить набор данных в R, используя функцию data(). Он отлично работает, когда я использую имя набора данных (например, data(Titanic) или data("Titanic")). Для меня не работает загрузка набора данных с использованием переменной вместо ее имени. Например:Загрузите набор данных в R с данными() с использованием переменной вместо имени набора данных

# This works fine: 
> data(Titanic) 

# This works fine as well: 
> data("Titanic") 

# This doesn't work: 
> myvar <- Titanic 
> data(myvar) 
**Warning message: 
In data(myvar) : data set ‘myvar’ not found** 

Почему R ищет данных с именем «MyVar», так как он не котируется? И поскольку это поведение по умолчанию, разве нет способа загрузить набор данных, хранящийся в переменной?

Для записи то, что я пытаюсь сделать, это создать функцию, которая использует правила ассоциации пакетов и рудников «arules», используя Apriori. Таким образом, мне нужно передать набор данных в качестве параметра этой функции.

myfun <- function(mydataset) { 
    data(mydataset) # doesn't work (data set 'mydataset' not found) 
    rules <- apriori(mydataset) 
} 

редактировать - выход sessionInfo():

> sessionInfo() 
R version 3.0.0 (2013-04-03) 
Platform: i386-w64-mingw32/i386 (32-bit) 

locale: 
[1] LC_COLLATE=English_United States.1252 LC_CTYPE=English_United States.1252 
[3] LC_MONETARY=English_United States.1252 LC_NUMERIC=C       
[5] LC_TIME=English_United States.1252  

attached base packages: 
[1] stats  graphics grDevices utils  datasets methods base  

other attached packages: 
[1] arules_1.0-14 Matrix_1.0-12 lattice_0.20-15 RPostgreSQL_0.4 DBI_0.2-7  

loaded via a namespace (and not attached): 
[1] grid_3.0.0 tools_3.0.0 

И фактические ошибки я получаю (используя, например, образец набора данных "хуг"):

xyz <- data.frame(c(1,2,3)) 
data(list=xyz) 
Warning messages: 
1: In grep(name, files, fixed = TRUE) : 
    argument 'pattern' has length > 1 and only the first element will be used 
2: In grep(name, files, fixed = TRUE) : 
    argument 'pattern' has length > 1 and only the first element will be used 
3: In if (name %in% names(rds)) { : 
    the condition has length > 1 and only the first element will be used 
4: In grep(name, files, fixed = TRUE) : 
    argument 'pattern' has length > 1 and only the first element will be used 
5: In if (name %in% names(rds)) { : 
    the condition has length > 1 and only the first element will be used 
6: In grep(name, files, fixed = TRUE) : 
    argument 'pattern' has length > 1 and only the first element will be used 

... 

... 

32: In data(list = xyz) : 
    c("data set ‘1’ not found", "data set ‘2’ not found", "data set ‘3’ not found") 
+0

Заметим, что поскольку вы уже признали, что либо 'data (« Titanic »)' OR 'data (Titanic)' работают, то не должно было быть слишком неожиданным, что 'data (myvar)' пытается загрузить набор данных с именем 'myvar' , – Dason

+0

Можете ли вы добавить вывод 'sessionInfo()'.Другие решения работают, поэтому мне интересно, почему вы получаете ошибки. Обходной путь, который у вас есть как «принятый», далеко не идеален ... – Dason

ответ

-1

Я отвечаю на свой вопрос, но я нашел решение наконец. Цитата R help:

«Наборы данных выполняются во всех загруженных пакетах, а затем в каталоге« data »(если есть) текущего рабочего каталога».

Таким образом, все, что нужно сделать, это записать набор данных в файл и поместить его в каталог с именем «данные» и расположенный в рабочем каталоге.

> write.table(mydataset,file="dataset.csv",sep=",",quote=TRUE,row.names=FALSE) # I intend to create a csv file, so I use 'sep=","' to separate the entries by a comma, 'quote=TRUE' to quote all the entries, and 'row.names=F to prevent the creation of an extra column containing the row names (which is the default behavior of write.table()) 

# Now place the dataset into a "data" directory (either via R or via the operating system, doesn't make any difference): 
> dir.create("data") # create the directory 
> file.rename(from="dataset.csv",to="data/dataset.csv") # move the file 

# Now we can finally load the dataset: 
> data("mydataset") # data(mydataset) works as well, but quoted is preferable - less risk of conflict with another object coincidentally named "mydataset" as well 
+0

А, это объясняет многое. Обычно люди используют 'read.csv' в этой ситуации.' data' обычно используется только вес купив файлы данных из пакетов, как в примере, указанном в вашем вопросе. В будущем вы получите лучшие ответы, если вы предоставите полный воспроизводимый пример. – Aaron

+0

Да, похоже, что я просто неправильно понял использование данных() - я думал, что это был необходимый шаг перед правилами добычи из набора данных. – pazof

+1

Люди должны знать, что @pazof действительно не знал, что он/она делает, и сделал кучу ненужных ошибок. Кроме того, его пример того, как была спровоцирована ошибка, был неполным. И тогда его «ответ» в основном неправильный. (Просто мое мнение, конечно, но я думаю, что он дал себе галочку, может ввести в заблуждение людей в будущем.) –

10

Используйте аргумент list. См. ?data.

data(list=myvar) 

Вам также необходимо myvar быть строка символов.

myvar <- "Titanic" 

Обратите внимание, что myvar <- Titanic работал только (я думаю) из-за отложенной загрузки набора данных Титаника. Большинство наборов данных в пакетах загружаются таким образом, но для других типов наборов данных вам все равно нужна команда data.

+0

Пробовал данные (list = myvar), но он создает 32 предупреждения типа «В данных (list = myvar): набор данных« 0 »не найден» , Пробовал то же самое, сохранив еще один набор данных arules («Бакалея») в myvar, и это совсем не загрузилось. («Ошибка в as.character.default (pattern): нет метода для принудительного применения этого класса S4 к вектору»). Возможно, мне нужно указать еще несколько параметров в data(), кроме списка = myvar? – pazof

+0

@DWin увидел вашу проблему; вам нужно, чтобы myvar был символьной строкой. – Aaron

+0

Извините за мой поздний ответ. Не работает :(он продолжает производить 32 предупреждения. Странно, что он производит 32 предупреждения для каждого набора данных, с которым я пытаюсь - даже небольших с 10 транзакциями или так. Действительно ли функция data() должна быть выполнена перед запуском apriori? Я имею в виду, если я непосредственно запускаю функцию apriori(), не запуская данные(), будут ли результаты неправильными или что-то? – pazof

4

Используйте переменную как символ. В противном случае вы будете обрабатывать содержимое «Титаника», а не его имя. Вам также может понадобиться использовать get, чтобы преобразовать значение символа в имя объекта.

myvar <- 'Titanic' 

myfun <- function(mydataset) { 
    data(list=mydataset) 
    str(get(mydataset)) 
} 

myfun(myvar) 
+0

Извините за мой поздний ответ. Не работает :(он продолжает производить 32. Что странно, так это то, что он производит 32 предупреждения для каждого набора данных, с которым я пытаюсь - даже небольших с 10 транзакциями или так. Действительно ли функция data() действительно должна выполняться перед запуском apriori? Я имею в виду, если я прямо запускаю функция apriori(), не запуская данные(), будут ли результаты неправильными или что-то? – pazof

0

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

data_object = get(myvar, asNamespace('<package_name>')) 

или просто:

data_object = get(myvar) 
Смежные вопросы