R中'comment'函数的良好用法是什么?


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评论”并找到相关结果非常困难,因此我希望这里的人可以与他分享经验。


3
我认为这个问题确实不需要成为CW。这是临界点,但还算不错。
csgillespie 2010年

很棒的信息!(时间序列包“ xts”具有类似的元数据功能。)
doug 2010年

2
建议关闭该问题:如果该问题被广义地解释(并且请注意,几乎所有答案都不是R特定的),这实际上是一个关于何时以及为什么要标记数据列的问题。这种数据管理问题显然是统计实践的常规部分,因此在这里可以说是话题性的。
银鱼

Answers:


15

除了@ Gavin,Frank Harrell在他的Hmisc包中开发了有效的方法来处理R中带注释的data.frame 。例如,label()units()函数允许向R对象添加专用属性。在生成data.frame的摘要时(例如with describe()),我发现它们非常方便。

使用此类额外属性的另一种有用方法是在数据集上应用时间戳。我还为随机种子,倍数(当使用k-kold或LOO交叉验证时)添加了属性。


14

我经常发现自己在R脚本中为特定数据分析任务所做的一件事是在脚本中包含有关数据帧中变量单位的注释。我处理环境数据时,化学家和生态学家似乎很喜欢对相同的事物使用各种不同的单位(mg L与mu eq L等)。我的同事通常将此信息存储在Excel工作表中列名称正下方的行中。111

我认为comment()这是将这些信息附加到数据框以供将来参考的一种好方法。


2
标准解决方案是包括一个用于度量单位的字段,以便可以对计算机进行编程,以将所有数值结果转换为通用(特定于参数)的单位。在评论中埋葬此关键信息使实现此功能变得困难或不可能。
whuber

2
@whuber,但是R在其基础对象中没有这样的构造,我不想编写一整个S4方法堆栈来重现携带单元信息的数据帧。请注意,这comment()不是代码中的注释。它将特定属性附加到可以是矢量的对象上,数据帧的每一列包含一个包含单位信息的元素。提取此信息很容易,所以我不明白为什么实施任何东西都会很困难或不可能?
恢复莫妮卡-G.辛普森

1
加文,我建议的简单得多。例如,如果有时硒浓度以mg / L记录,而其他时间以meq / L记录,则您可以轻松选择后者的所有实例,然后将浓度乘以适当的因子以将其转换为mg / L。但是,尽管这可能是您反对的根源,但R绝对不是维护数据库和执行此类过程的正确位置,即使它能够这样做。最好通过良好的数据库管理系统来补充此类工作。
ub

4
但愿如此!comment()等人可以方便地获得临时注释和信息,但是需要更适当的系统来进行大规模数据处理。有趣的是,我们现在必须在我所从事的研究小组和咨询机构中解决有关化学数据的问题,并且需要将其保存到适当的数据库中。
恢复莫妮卡-G.辛普森

8

其他软件包中也存在类似的功能,例如Stata中-notes-命令。我们用它来记录变量的全部详细信息,例如生化测量的测定详细信息或询问问卷数据的问题的确切措辞。对于变量名或标签,这通常是太多信息,在涉及该变量的每个分析的输出中都将显示其中一个或两个,因此最好使其合理地简短。


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] )

2

请允许我在R:repo包中提出我对对象管理的一般解决方案。使用它,您可以为每个变量分配一个长名称,一个描述,一组标签,一个远程URL,依赖关系,还可以附加图形或通用外部文件。例如,源代码可以存储为存储库项目,并附加到其产生的资源中。在CRAN(install.packages("repo"))上找到最新的稳定版本,或者在github上找到最新的开发。快速浏览这里。希望能帮助到你。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.