R数据帧中的动态列

时间:2013-09-23 21:01:05

标签: r indexing

我正在玩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之后的下一个数字,但除此之外我不知道为什么这不起作用。

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

提前致谢!

1 个答案:

答案 0 :(得分:1)

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

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

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

相关问题