#r
#r
Вопрос:
Использование str(survey_OM)
в моем фрейме данных указывает, что все мои числовые данные atomic
. Если я использую, class(survey_OM$perc.OM)
это возвращает numeric
.
Я всегда думал, что второй столбец str
показывает класс данных, но это не кажется таким простым… итак, мои вопросы:
- Что такое второй столбец
str
отчета? - Что такое
atomic
и чем оно отличается отnumeric
? - Почему в этом случае данные будут отображаться как
atomic
, а неnum
orint
?
Спасибо.
dput(head(survey_OM, 20))
обеспечивает:
> dput(head(survey_OM, 20))
structure(list(lake = structure(c(3L, 3L, 3L, 3L, 3L, 3L, 3L,
3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 3L), .Label = c("E-2",
"E-4", "E pond", "EX 1", "GTH 110", "GTH 112", "GTH 114", "GTH 156",
"GTH 91", "GTH 98", "N-1", "NE-10", "NE-11", "NE-3", "NE-8",
"NE-9", "NE-9b", "S-10", "S-11", "S-3", "S-6", "S-7"), class = "factor"),
date = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("2007/06/15",
"2007/06/18", "2007/06/19", "2007/06/20", "2007/06/21", "2007/06/27",
"2007/06/29", "2007/07/07", "2007/07/19", "2007/07/20", "2008/07/26",
"2008/07/30", "2008/08/04", "2008/08/06"), class = "factor"),
depth = structure(c(2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("E",
"epi", "H", "hypo"), class = "factor"),
depth.m = structure(c(6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L, 6L), .Label = c("", "10.9", "12.9", "1.5", "2",
"2.1", "2.2", "2.3", "2.4", "2.5", "2.6", "2.7", "3", "3.1",
"3.5", "4", "4.2", "4.8", "4.9", "5", "5.1", "5.5", "6",
"6.5", "7", "7.2", "9.9", "not recorded"), class = "factor"),
rep = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L), .Label = c("A",
"B", "C"), class = "factor"),
sed = c(0L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L, 0L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 8L, 9L),
notes = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L,
1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), .Label = c("",
"col on SE side", "lg snail shell", "not collected", "very hard sediments"
), class = "factor"),
dry.mass = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0),
perc.OM = c(47.1300248455119, 47.4260808104607, 47.7349307375515, 46.4501104675465, 44.1513415737111, 43.5608499678045, 42.9921259842519, 42.2674677347574, 39.6643311064039,
39.0968130690949, 46.7768514928267, 46.9211608642763, 46.7877013177158,
47.0709930313588, 44.3241152581706, 43.7905468025952, 41.706074101281,
36.5061097383474, 37.4329041152142, 37.7757939038389)), .Names = c("lake",
"date", "depth", "depth.m", "rep", "sed", "notes", "dry.mass",
"perc.OM"), comment = c("working data frame of the sediment char from the 2007 sed survey created:", "Wed Apr 27 14:23:33 2011"), row.names = c(NA, 20L), class = "data.frame")
и полный вывод str(survey_OM)
является:
> str(survey_OM)
'data.frame': 780 obs. of 9 variables:
$ lake : Factor w/ 22 levels "E-2","E-4","E pond",..: 3 3 3 3 3 3 3 3 3 3 ...
..- attr(*, "comment")= chr "names of the lakes"
$ date : Factor w/ 14 levels "2007/06/15","2007/06/18",..: 2 2 2 2 2 2 2 2 2 2 ...
..- attr(*, "comment")= chr "date that the cores were collected"
$ depth : Factor w/ 4 levels "E","epi","H",..: 2 2 2 2 2 2 2 2 2 2 ...
..- attr(*, "comment")= chr "relative depth ID; epi = shallowest corable Z, hypo = deepest Z, S, M, D = shallow, med, deep"
$ depth.m : Factor w/ 28 levels "","10.9","12.9",..: 6 6 6 6 6 6 6 6 6 6 ...
..- attr(*, "comment")= chr "depth that core was collected in m"
$ rep : Factor w/ 3 levels "A","B","C": 1 1 1 1 1 1 1 1 1 1 ...
..- attr(*, "comment")= chr "replicate ID for core"
$ sed : atomic 0 1 2 3 4 5 6 7 8 9 ...
..- attr(*, "comment")= chr "depth of sample from sed/water interface in cm"
$ notes : Factor w/ 5 levels "","col on SE side",..: 1 1 1 1 1 1 1 1 1 1 ...
..- attr(*, "comment")= chr "comments on sample"
$ dry.mass: atomic 0 0 0 0 0 0 0 0 0 0 ...
..- attr(*, "comment")= chr "dry mass of the sediment at that sed Z in g/m^2"
$ perc.OM : atomic 47.1 47.4 47.7 46.5 44.2 ...
..- attr(*, "comment")= chr "percent OM of the samp. based on LOI at 550d C"
- attr(*, "comment")= chr "working data frame of the sediment char from the 2007 sed survey created:" "Wed Apr 27 14:23:33 2011"
Комментарии:
1. @KennyPeanuts: Что касается (2), я думаю, что ‘atomic’ — это общий термин для следующих типов данных — символьных, комплексных, двойных, целых и логических.
2. @KennyPeanuts: Что касается (1), если я правильно понял ваш вопрос, вы не знаете, почему столбец ‘notes’ в ‘my.data’ отображается как ‘Factor’. R обычно приводит данные в соответствие с натуральными числами (1, 2, 3, …), чтобы уменьшить использование памяти. Эти числа, которые соответствуют исходным данным, называются «Коэффициентами». Например, если у меня есть вектор (‘a’, ‘b’, ‘c’, ‘a’, ‘a’, ‘b’), R не видит смысла хранить шесть строк, скорее он создает соответствие ‘a’: 1, ‘b’: 2, ‘c’: 3 и сохраняет вектор как (1,2,3,1,1,2).
3. @Jubbles, спасибо за ваш вклад. Это не совсем то, что меня смущает. Я понимаю
Factor
в случае notes. Что мне неясно, так это то, почему числовые переменные (например, perc. OM) были обозначеныatomic
, а неnum
. Я все еще не совсем понимаю, чтоatomic
такое, но, как вы предполагаете, это общий тип данных, который включает числовой. Если я использую typeof (my.data $ perc. OM), я получаюdouble
(и я не уверен, чем это отличается от класса numeric). Я думаю, мне нужно лучше понять типы данных и классы R.4. Можете ли вы включить весь
str()
вывод — вы, по крайней мере, обрезали верхнюю часть. Кроме того, некоторые или все данные были бы полезны. Если это фрейм данных,dput(head(my.data, 20))
нам должно хватить данных для работы. Отредактируйте свой вопрос, чтобы включить эту информацию, пожалуйста.5. @Gavin Simpson, извините, что я так долго отвечал — я добавил данные, которые, по вашему мнению, были бы полезны для ответа на вопрос. Спасибо за вашу помощь.
Ответ №1:
Просматривая utils:::str.default
, мы видим, что получаем обычный вывод int
, num
и т.д., Если верно следующее if
утверждение:
if ( is.vector(object)
|| (is.array(object) amp;amp; is.atomic(object))
|| is.vector(object, mode = "language")
|| is.vector(object, mode = "symbol")
)
Мы получаем, atomic
если это утверждение ложно (а в противном случае это было бы int
, num
и т.д.).
Просматривая страницу справки для is.vector
, мы видим, что она возвращает true, только если это вектор без атрибутов, кроме имен. Вот фрейм данных, у b
которого есть дополнительный атрибут:
d <- data.frame(a=1:4, b=5:8)
attr(d$b, "tmp") <- "surprise!"
И вызов str
этого параметра дает atomic
for b
вместо int
.
> str(d)
'data.frame': 4 obs. of 2 variables:
$ a: int 1 2 3 4
$ b: atomic 5 6 7 8
..- attr(*, "tmp")= chr "surprise!"
Я вижу в вашей правке, что у вас есть дополнительные атрибуты для элементов вашего фрейма данных, и что вы также получаете эти дополнительные строки о ваших атрибутах, так что, казалось бы, это объясняет это.
Комментарии:
1. спасибо за ваш вклад в мой вопрос. Это помогает мне немного лучше понять, что происходит под капотом… Я добавил
dput
запрошенные данные, надеюсь, это прояснит проблему.2. спасибо за ваш ответ. Я удалил комментарии (т. Е. Дополнительные атрибуты), и
mode
вstr
вернулись к ожидаемым результатам. Я только начал добавлять комментарии, но, полагаю, мне понадобится a, чтобы найти другой способ аннотирования моих фреймов данных. Еще раз спасибо3. 1 за расшифровку
str
кода. Я видел это же утверждение, но не смог сделать правильную интерпретацию, как это сделали вы.
Ответ №2:
R разделяет типы данных на атомарные и рекурсивные. Все, что большинство людей называют векторами, является атомарным (как упоминалось несколькими людьми до сих пор.) Списки могут иметь произвольные уровни сложности, т. Е. Списки внутри списков, и будут возвращать FALSE из is.atomic(). Атомарные векторы могут иметь атрибуты без потери их ‘атомарности’.
Комментарии:
1. Да, но на самом деле это не отвечает на основную мысль вопроса — почему
atomic
, а не на фактический режим? Как получить такой объект?
Ответ №3:
Я полагаю, что ваши три вопроса по существу сводятся к одному.
Второй столбец str()
возвращает mode
объект, а не класс. Инструкция ?atomic
перенаправляет на ?vector
, где указано: «Атомарными режимами являются «логический», «целое число», «числовой» (синоним «double»), «комплексный», «символьный» и «необработанный»».
Таким образом, numeric
это один из режимов atomic
.
mode
относится к режиму хранения объекта. Смотрите ?mode
для получения более подробной информации.
Комментарии:
1. Но попробуйте получить
str()
для выводаatomic
вместо определенного режима данных… Я думаю, что в этом суть вопроса, как предполагают комментарии выше из OP. Почему он показываетatomic
, а не реальный режим?