Чим корисно використовувати функцію «коментар» в R?


35

Я щойно відкрив commentфункцію в Р. Приклад:

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

Я вперше зайшов за цією функцією і цікавився, що є загальним / корисним для цього. Оскільки досить важко шукати "коментар" R в Google і знайти відповідні результати, я сподівався, що хтось тут може поділитися своїм досвідом.


3
Я не думаю, що це питання справді має бути CW. Це кордон, але це не дуже погано.
csgillespie

чудова інформація! (пакет часових рядів "xts" має подібну функціональність метаданих.)
Дог

2
Це питання було запропоновано для закриття: якщо питання широко розшифроване (і зауважимо, що майже жодна відповідь не є специфічною для R), це справді питання про те, коли і навіщо хотілося б позначити стовпці даних. Цей вид управління даними, очевидно, є регулярною частиною статистичної практики, тому, мабуть, тут є темою.
Срібна рибка

Відповіді:


15

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

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


14

Одне з яких я часто роблю в своїх сценаріях R для певного завдання аналізу даних - це включати коментарі до сценарію про одиниці змінних у мої кадри даних. Я працюю з даними про навколишнє середовище, і хімікам, і екологам, здається, подобається використовувати широкий спектр різних одиниць для одних і тих же речей (mg L vs mu eq L тощо). Мої колеги зазвичай зберігають цю інформацію в рядку безпосередньо під назвами стовпців на аркушах Excel.- 1-1-1

Я б вважав comment()гарним способом приєднання цієї інформації до кадру даних для подальшого використання.


2
Стандартне рішення полягає у включенні поля для одиниць вимірювання, щоб комп'ютер міг бути запрограмований для перетворення всіх числових результатів у загальні (параметри) одиниці. Поховання цієї важливої ​​інформації у коментарях робить реалізацію цієї можливості важкою або неможливою.
whuber

2
@whuber, але R не має такої конструкції в його базових об'єктах, і я не хочу писати цілий стек методів S4 для відтворення кадрів даних, що містять інформацію про одиницю. Зверніть увагу, що comment()це не коментарі в коді. Він приєднує специфічний атрибут до об'єкта, який може бути вектором, одним елементом на стовпчик кадру даних, що містить одиницю інформації. Витягнути цю інформацію легко, тому я не розумію, чому реалізувати щось було б складно чи неможливо?
Відновіть Моніку - Г. Сімпсон

1
Гевін, я пропоную щось набагато простіше. Наприклад, якщо іноді концентрації селену реєструються в мг / л, а в інші рази як мекв / л, ви можете легко вибрати всі екземпляри останнього і помножити концентрацію на відповідний коефіцієнт, щоб перетворити його на мг / л. Однак - це може бути джерелом ваших заперечень R- це, безумовно, не правильне місце для підтримки баз даних та виконання процесів такого типу, навіть якщо це здатне. Найкраще для такої роботи доповнюється хороша система управління базами даних.
whuber

4
Амін тому! comment()та ін. зручні для спеціальних нотаток та інформації, але для більшої обробки даних потрібна відповідна система. Цікаво, що нам доводиться вирішувати це питання в рамках дослідницької групи та консультацій, над якими я працюю, стосовно наших даних про хімію та потребують перенесення їх у належну базу даних.
Відновіть Моніку - Г. Сімпсон

8

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


4

Однією з речей, за якою я багато роблю, є відстеження команд, які використовуються для генерування даних та об’єктів, і я знайшов коментар корисним інструментом для цього.

"Matched.call.data" та "generator.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] )

2

Дозвольте запропонувати моє загальне рішення для управління об'єктом в R: repoпакет. Використовуючи його, ви можете призначити кожній змінній довге ім’я, опис, набір тегів, віддалену URL-адресу, залежність залежностей, а також додавати фігури або загальні зовнішні файли. Наприклад, вихідний код може зберігатися як елемент сховища та додаватися до вироблених ним ресурсів. Знайдіть останню стабільну версію на CRAN ( install.packages("repo")) або останню розробку на github . Швидкий огляд тут . Сподіваюся, це допомагає.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.