【问题标题】:R can't find a functionR找不到函数
【发布时间】:2014-02-28 18:35:29
【问题描述】:

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

当我跑步时:

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

我会看到列名发生了变化,因为我创建了一个数据框,然后对其进行了更改。我很确定这两个代码 sn-ps 除了对象创建之外是相同的。我不知道 R 是否只是在这个函数上不灵活,我有时必须创建对象而不是其他对象。但是错误“...找不到功能”对我来说似乎有点奇怪。有人可以解释这个错误吗?

【问题讨论】:

    标签: r


    【解决方案1】:

    正如其他人所说,您需要先命名数据框。 (尽管有一种方法可以避免这种情况;请继续关注。)但是您已经知道了,并且想知道原因。在这里。

    这样的函数是替换函数。它们是一种“语法糖”,可以使某些操作更简单。有关详细信息,请参阅此答案: 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&lt;- 函数。

    您可以通过不使用 names&lt;- 的语法糖版本而是直接使用它来完成您想要的操作,因为这不会尝试执行分配。

    `names<-`(data.frame(tmp), c("A","B"))
    

    【讨论】:

    【解决方案2】:

    您希望第一个命令的返回值是多少?考虑:

    > (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
    

    【讨论】:

      猜你喜欢
      • 2018-05-16
      • 2015-11-06
      • 2019-07-08
      • 2018-05-29
      • 2014-04-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多