Каков второй столбец отчета `str` в R и что означает `atomic` в этом столбце?

#r

#r

Вопрос:

Использование str(survey_OM) в моем фрейме данных указывает, что все мои числовые данные atomic . Если я использую, class(survey_OM$perc.OM) это возвращает numeric .

Я всегда думал, что второй столбец str показывает класс данных, но это не кажется таким простым… итак, мои вопросы:

  1. Что такое второй столбец str отчета?
  2. Что такое atomic и чем оно отличается от numeric ?
  3. Почему в этом случае данные будут отображаться как atomic , а не num or int ?

Спасибо.
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 , а не реальный режим?