我正在尝试重命名列而不创建对象(数据帧)。
当我跑步时:
names(data.frame(cbind(LETTERS[1:3],1:3)))[1]<-"A"
我明白了:
Error in names(data.frame(cbind(LETTERS[1:3], 1:3)))[1] <- "A" : could not find function "data.frame<-"
如果我跑:
X<-data.frame(cbind(LETTERS[1:3],1:3))
colnames(X)[1]<-"letters"
X
我会看到列名更改,因为我创建了一个数据框然后更改了它。我很确定除了对象创建之外,这两个代码片段是相同的。我不知道R是否只是在这个功能上不灵活,我必须有时创建对象而不是其他对象。但错误“......找不到功能”对我来说似乎有些奇怪。有人可以解释这个错误吗?
答案 0 :(得分:15)
正如其他人所说,您需要先命名数据框。 (虽然有办法避免这种情况;请继续关注。)但是你已经知道了,并想知道原因。在这里。
这样的功能是替换功能。它们是一种“语法糖”,使某些操作变得更简单。有关详情,请参阅此答案: https://stackoverflow.com/a/11563358/210673
以下是替换函数的示例以及它真正等同的内容。
names(d) <- c("A","B")
d <- `names<-`(d, c("A","B"))
因此,您的来电确实是(为了简单起见,请将结果从cbind
中取出)
tmp <- cbind(LETTERS[1:3],1:3)
data.frame(tmp) <- `names<-`(data.frame(tmp), c("A","B"))
反过来试图打电话
tmp <- `data.frame<-`(tmp, `names<-`(data.frame(tmp), c("A","B")))
并且因为没有data.frame<-
函数而失败。
您可以通过不使用names<-
的语法糖版本来完成您想要的,而是直接使用它,因为这不会尝试进行分配。
`names<-`(data.frame(tmp), c("A","B"))
答案 1 :(得分:5)
您期望第一个命令的返回值是什么?考虑:
> (colnames(X)[1]<-"letters")
[1] "letters"
所以即使在那里为了看到数据帧输出你也必须运行另一个命令。也许setNames
可以让你成为你想去的地方的一部分:
> setNames(data.frame(cbind(LETTERS[1:3],1:3)), c("letters"))
letters NA
1 A 1
2 B 2
3 C 3
或者更好:
> data.frame(letters=LETTERS[1:3], 1:3)
letters V2
1 A 1
2 B 2
3 C 3