0

我正在玩 R 数据帧,并试图弄清楚它们是如何工作的。在下面的示例中,我尝试使用 1 行数据框对向量的元素进行去重。我知道有很多更好的方法可以做到这一点,比如 unique(),或者使用哈希库等。这更多的是关于学习数据框的工作原理。

如果要添加的列名是字符串,则第一部分可以正常工作:

> v = c(1, 2, 3, 10, 100, 50, 50, 100, 1, 2, 3, 10)
> d = data.frame(row.names=c('the row'))
> d
data frame with 0 columns and 1 rows
> for (x in v) { d[1,as.character(x)] = x}
> d
        1 2 3 10 100 50
the row 1 2 3 10 100 50

但是,如果我尝试使用数字作为列名,我会得到非常奇怪的行为:

> e = data.frame(row.names=c('the row'))
> for (x in v) { e[1,x] = x}
Error in `[<-.data.frame`(`*tmp*`, 1, x, value = 10) : 
  new columns would leave holes after existing columns
> e
        V1 V2 V3
the row  1  2  3

首先,“V1”、“V2”和“V3”是从哪里来的?其次,为什么这不起作用?我的意思是,我可以算出 10 不是 3 之后的下一个数字并不高兴,但除此之外,我不知道为什么这不起作用。

列只能作为字符串索引吗?其他值得了解的限制?

提前致谢!

4

1 回答 1

1

要回答V1, V2, V3名称的来源,请查看第 139 行的源代码'[<-.data.frame'

> deparse(`[<-.data.frame`)[139]
[1] "                new.cols <- paste0(\"V\", seq.int(from = nvars + "

至于为什么只有 3 列e[1,10] = 10e不起作用,好吧,它根本不起作用。如果您认为这与您之前的结果 ( d) 相矛盾,请输入d[,4]并查看会发生什么。

于 2013-09-23T21:29:41.513 回答