Что хорошего в использовании функции 'comment' в R?

35

Я только что обнаружил commentфункцию в R. Пример:

x <- matrix(1:12, 3,4)
comment(x) <- c("This is my very important data from experiment #0234",
                "Jun 5, 1998")
x
comment(x)

Это первый раз, когда я пришел с этой функцией, и мне было интересно, как часто / полезно ее использовать. Так как в Google довольно сложно найти "R comment" и найти релевантные результаты, я надеялся, что кто-то здесь поделится своим опытом.

Таль Галили
источник
3
Я не думаю, что этот вопрос действительно должен быть CW. Это граница, но это не так уж плохо.
csgillespie
отличная информация! (пакет временных рядов 'xts' обладает аналогичной функциональностью метаданных.)
doug
2
Этот вопрос был предложен для закрытия: если вопрос широко истолкован (и обратите внимание, что практически ни один из ответов не является специфичным для R), то это действительно вопрос о том, когда и почему нужно маркировать столбцы данных. Этот вид проблемы управления данными, несомненно, является регулярной частью статистической практики, поэтому, возможно, это актуально здесь.
Серебряная рыба

Ответы:

15

Во-вторых, @Gavin, Фрэнк Харрелл разработал эффективные способы обработки аннотированных data.frame в R в своем пакете Hmisc . Например, label()и units()функции позволяют добавлять специальные атрибуты объектов R. Я нахожу их очень удобными при создании сводки data.frame (например, с describe()).

Еще один полезный способ использования такого дополнительного атрибута - применить временную метку к набору данных. Я также добавляю атрибут для таких вещей, как случайное начальное число, номер сгиба (когда я использую перекрестную проверку k-kold или LOO).

хл
источник
14

Одна вещь, которую я часто обнаруживаю в своих R-скриптах для конкретной задачи анализа данных, - это включение в скрипт комментариев о единицах переменных в моих фреймах данных. Я работаю с данными об окружающей среде, и химикам и экологам, похоже, нравится использовать широкий диапазон различных единиц для одних и тех же вещей (мг л против му экв л и т. Д.). Мои коллеги обычно хранят эту информацию в строке непосредственно под именами столбцов на листах Excel.- 111

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

Восстановить Монику - Дж. Симпсон
источник
2
Стандартное решение состоит в том, чтобы включить поле для единиц измерения, чтобы можно было запрограммировать компьютер для преобразования всех числовых результатов в общие (зависящие от параметра) единицы. Скрытие этой важной информации в комментариях делает реализацию этой возможности трудной или невозможной.
whuber
2
@whuber, но R не имеет такой конструкции в своих базовых объектах, и я не хочу писать полный стек методов S4 для воспроизведения фреймов данных, которые переносят информацию об устройстве. Обратите внимание, что comment()это не комментарии в коде. Он прикрепляет к объекту определенный атрибут, который может быть вектором, один элемент на столбец фрейма данных, содержащий информацию о единицах. Эту информацию легко извлечь, поэтому я не понимаю, почему реализовать что-либо было бы сложно или невозможно?
Восстановить Монику - Г. Симпсон
1
Гэвин, я предлагаю что-то гораздо более простое. Например, если иногда концентрации селена записываются в мг / л, а другие - в мэкв / л, вы можете легко выбрать все экземпляры последнего и умножить концентрацию на соответствующий коэффициент, чтобы преобразовать ее в мг / л. Однако - это может быть источником вашего возражения R- определенно не является подходящим местом для поддержки баз данных и выполнения процессов такого типа, даже если он способен на это. Лучше всего дополняется хорошей системой управления базами данных для такой работы.
whuber
4
Бог с ним! comment()и др. удобны для специальных заметок и информации, но для крупномасштабной обработки данных требуется надлежащая система. Интересно, что сейчас мы должны решить эту проблему в исследовательской группе и консультанте, в котором я работаю, в отношении наших данных по химии, и нам необходимо поместить их в надлежащую базу данных.
Восстановить Монику - Дж. Симпсон
8

Подобные возможности существуют в других пакетах, таких как -notes- команда в Stata . Мы используем это, чтобы документировать полную информацию о переменной, например, подробности анализа для биохимического измерения или точную формулировку вопроса, задаваемого для данных вопросника. Часто это слишком много информации для имени переменной или метки, одна или обе из которых отображаются в выходных данных каждого анализа, включающего переменную, и, следовательно, их лучше сохранять достаточно короткими.

универсальный
источник
4

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

'Matched.call.data' и 'generate.command.string' делают свое дело. Не идеально, но полезно и используется для 'comment ()'. :)

# Comments only accept strings...
# Substituting the escaped quotes ('\"') makes it prettier.
generate.command.string <- function( matched.call.data )
{
  command.string <- as.character( bquote( .( list( matched.call.data ) ) ) )
  sapply( bquote( .(command.string) ),
                  USE.NAMES=FALSE,
                  function( x )
                    gsub( "\\\"", "\'", as.list( match.call() )$x )[[2]] )
}

# Some generating function...
generate.matrix <- function( nrows, ncols, data=NA ) {
  # Some generated object
  mat <- matrix( data= data, nrow= nrows, ncol= ncols )

  matched.call.data <- do.call( "call",
                                c( list( as.character( match.call()[[1]] ) ),
                                lapply( as.list( match.call() )[-1], eval ) ) )
  comment( mat ) <- c( Generated= date(),
                       Command = generate.command.string( matched.call.data ) )

  mat
}

# Generate an object with a missing argument.
emptyMat <- generate.matrix( nrows=2, ncols=2 )
comment( emptyMat )

# Generate without formally stating arguments.
dataMat <- generate.matrix( 2, 2, sample(1:4, 4, replace= TRUE ) )
comment( dataMat )

# And with a longer command.
charMat <- generate.matrix( 3, 3,
                  c( 'This', 'is', 'a', 'much', 'longer',
                     'argument', 'section', 'that', 'wraps') )
comment( charMat )

# And with a variable.
myData <- c( 'An', 'expanded', 'command', 'argument')
charMat2 <- generate.matrix( 2, 2, myData )
comment( charMat2 )

# Create a new object from an original command.
Sys.sleep(1)
emptyMat2 <- eval( parse( text= comment( emptyMat )[['Command']] ) )
dataMat2 <- eval( parse( text= comment( emptyMat )[['Command']] ) )

# Check equality of the static matrices.
identical( emptyMat, emptyMat2 )

# The generation dates are different.
all.equal( emptyMat, emptyMat2, check.attributes= FALSE )
comment( emptyMat )['Generated'] <- NA
comment( emptyMat2 )['Generated'] <- NA
identical( emptyMat, emptyMat2 )

# Command argument structure still works too.
str( as.list( match.call(
  generate.matrix, parse( text=comment( charMat2 )[[ 'Command' ]] ) ) )[-1] )
Thell
источник
2

Позвольте мне предложить мое общее решение для управления объектами в R: repoпакет. Используя его, вы можете назначить каждой переменной длинное имя, описание, набор тегов, удаленный URL, отношения зависимостей, а также прикрепить рисунки или общие внешние файлы. Например, исходный код может быть сохранен как элемент репозитория и присоединен к ресурсам, созданным им. Найдите последнюю стабильную версию CRAN ( install.packages("repo")) или последнюю версию на github . Краткий обзор здесь . Надеюсь, это поможет.

Франческо Наполитано
источник