这些数据帧分配有什么区别?

时间:2013-06-06 20:08:07

标签: r

我的数据框看起来像这样:

 pid tid      pname 
 2   NA       proc/boot/procnto-smp-instr

现在,如果我这样做,我预计不会发生任何事情:

  

y [c(FALSE),“pid”]< - 10

没有任何反应(y没有改变)。但是,如果我这样做:

  

y [c(FALSE),] $ pid< - 10

我明白了:

  

$<-.data.frame中的错误(*tmp*,“pid”,值= 10):
    替换   有1行,数据有0

所以我的问题是,[, "col"]<-$col<-之间有什么区别?为什么会抛出异常?还有奖励:我可以在文档中哪些地方阅读更多相关信息吗?

2 个答案:

答案 0 :(得分:2)

错误来自$<-.data.frame的代码,它检查原始data.frame是否至少与替换向量的长度一样多行:

 nrows <- .row_names_info(x, 2L)
    if (!is.null(value)) {
        N <- NROW(value)
        if (N > nrows) 
            stop(sprintf(ngettext(N, "replacement has %d row, data has %d", 
                "replacement has %d rows, data has %d"), N, nrows), 
                domain = NA)

[<-是一个不同的函数,它不执行此检查。这是一个primitive函数,您可以在R Internals manual

中详细了解它

答案 1 :(得分:1)

这一次,这些操作由两个非常不同的函数执行: y[FALSE, 'pid'] <- 10是对[<-.data.frame函数的调用,而 y[FALSE, ]$pid <- 10是对$<-.data.frame函数的调用,错误消息为您提供了这个线索。通过输入他们的名字可以看到他们有多么不同(带背面引号,就像上面一样)。但是,在这种特殊情况下,他们的行为方式相同。他们通常会这样做。试试y[1, 'pid'] <- 1:3 vs y[1, ]$pid <- 1:3。你的情况是“特殊的”,因为y[FALSE, ]会返回一个“奇怪”的对象 - 一个包含0行和3列的data.frame。恕我直言,抛出异常是一种正确的行为,这是[<-.data.frame函数中的一个小错误,但语言开发人员对此主题的看法更为重要。如果您想了解差异所在,请键入debug([<-.data.frame)并运行您的示例。 你的“奖金”问题的答案是键入?[<-.data.frame并阅读,虽然它非常非常干燥:(。最好。

PS。格式化条带反引号,例如,[<-.data.frame意味着。遗憾。