我正在玩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之后的下一个数字,但除此之外我不知道为什么这不起作用。
列只能作为字符串索引吗?其他值得了解的限制?
提前致谢!
答案 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]
并查看会发生什么。