Что такое параметр "класс" в структуре ()? - PullRequest
3 голосов
/ 23 ноября 2011

Я пытаюсь использовать функцию structure() для создания фрейма данных в R. Я видел что-то вроде этого

structure(mydataframe, class="data.frame")

Откуда появился класс?Я видел, как кто-то использовал его, но он не указан в документе R.

Это то, что программисты выучили на другом языке и перенесли это?И это работает.Я очень смущен.

Редактировать: я понял, что dput () - это то, что фактически создает фрейм данных, похожий на этот.Я понял это, ура!

Ответы [ 3 ]

7 голосов
/ 23 ноября 2011

Вы, вероятно, видели, что кто-то использует dput.dput используется для публикации (обычно коротких) данных.Но обычно вы бы не создавали фрейм данных подобным образом.Обычно вы создаете его с помощью функции data.frame.См. Ниже

> example_df <- data.frame(x=rnorm(3),y=rnorm(3))
> example_df
           x          y
1  0.2411880  0.6660809
2 -0.5222567 -0.2512656
3  0.3824853 -1.8420050
> dput(example_df)
structure(list(x = c(0.241188014013708, -0.522256746461544, 0.382485333260912
), y = c(0.666080872170054, -0.251265630627216, -1.84200501106852
)), .Names = c("x", "y"), row.names = c(NA, -3L), class = "data.frame")

Затем, если кто-то хочет «скопировать» ваш data.frame, он просто должен выполнить следующее:

> copied_df <- structure(list(x = c(0.241188014013708, -0.522256746461544, 0.382485333260912
+     ), y = c(0.666080872170054, -0.251265630627216, -1.84200501106852
+     )), .Names = c("x", "y"), row.names = c(NA, -3L), class = "data.frame")

Я поставил «копировать» в кавычки, потому чтообратите внимание на следующее:

> identical(example_df,copied_df)
[1] FALSE
> all.equal(example_df,copied_df)
[1] TRUE

identical приводит к значению false, потому что когда вы публикуете вывод dput, часто числа округляются до определенного десятичного знака.

4 голосов
/ 24 ноября 2011

'class' не является специфическим аргументом для функции structure - поэтому вы не нашли его в файле справки.

structure берет объект, а затем любое количество пар имя / значение и устанавливает их в качестве атрибутов объекта. В этом случае class был таким атрибутом. Вы можете попробовать это, чтобы добавить вымышленные атрибуты 'foo' и 'bar' к вектору:

x <- structure(1:3, foo=42, bar='hello')
attributes(x)
#$foo
#[1] 42
#
#$bar
#[1] "hello"

И, как упоминали Джошуа Ульрих и Сюй Ван, вы не должны создавать data.frame как этот.

2 голосов
/ 24 ноября 2011

Я чешу голову, удивляясь, что «R Document» не сказал бы что-то о «классе». Это очень базовый компонент языка и того, как применяются функции. Вы должны напечатать это и прочитать:

?class
?methods
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...