【问题标题】:R: return column using get() and paste()R:使用 get() 和 paste() 返回列
【发布时间】:2015-12-02 20:45:43
【问题描述】:

为什么 get()paste() 结合使用可用于数据帧,但不能用于数据帧中的列?我怎样才能让它工作?

ab<-12
get(paste("a","b",sep=""))
# gives: [1] 12

ab<-data.frame(a=1:3,b=3:5)
ab$a
#gives: [1] 1 2 3

get(paste("a","b",sep=""))
# gives the whole dataframe

get(paste("ab$","a",sep=""))
# gives: Error in get(paste("ab$", "a", sep = "")) : object 'ab$a' not found

【问题讨论】:

  • 严肃的问题:你为什么要这样做?
  • 可以eval(parse(text = ...))来做这件事,但是R让这件事变得尴尬和困难的程度应该表明你使用get的整个方法是可能并不理想。
  • 只是因为$ 是一个函数,而get 不会评估传递给它的对象,请尝试使用cget("c(1,2,3)")

标签: r indexing


【解决方案1】:

数据框中的列不是一流的对象。它们的“名称”实际上是列表提取的索引值。尽管names 函数的存在引起了可以理解的混淆,但它们不是真正的 R 名称,即 R 对象列表中未加引号的标记或符号。请参阅?is.symbol 帮助页面。 get 函数接受一个字符值,然后在工作区中查找它并返回它以供进一步处理。

> ab<-data.frame(a=1:3,b=3:5)
> ab$a
[1] 1 2 3
> get(paste("a","b",sep=""))
  a b
1 1 3
2 2 4
3 3 5
> 
> # and this would be the way to get the 'a' column of the ab object

get(paste("ab",sep=""))[['a']]

如果有一个命名对象target 的值为“a”,你也可以这样做:

target <- "a"
get(paste("ab",sep=""))[[target]]  # notice no quotes around target 
                                   # because `target` is a _real_ R name

【讨论】:

    【解决方案2】:

    它不起作用,因为get() 将其传递的字符串解释为引用名为"ab$a" 的对象(而不是引用名为"a" 的名为"ab" 的对象的元素)。以下可能是了解其含义的最佳方式:

    ab<-data.frame(a=1:3,b=3:5)
    `ab$a` <- letters[1:3]
    get("ab$a")
    # [1] "a" "b" "c"
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多