R找不到功能

时间:2014-02-28 18:35:29

标签: r

我正在尝试重命名列而不创建对象(数据帧)。

当我跑步时:

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是否只是在这个功能上不灵活,我必须有时创建对象而不是其他对象。但错误“......找不到功能”对我来说似乎有些奇怪。有人可以解释这个错误吗?

2 个答案:

答案 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