【问题标题】:Misunderstanding creating r function创建 r 函数的误解
【发布时间】:2015-01-27 11:31:51
【问题描述】:

我正在尝试使用正在运行的命令行创建一个函数。我正在为一个看起来像这样的数据集创建一个标识符

Nom Var1  Var2
N1    v11   v12
N2     .     .
N2     .     .
N3    V32   V32

我的命令是:transform(df$Nom, id=match(df$Nom, unique(df$Nom))) 并且工作正常。 但是,如果我写一个像 ht 之后的函数;我收到错误:“唯一适用于向量”

 createid<-function(var){
   x<- transform(var, id=match(var, unique(var)))
   ids<-paste0("id_",x[,2])
   return(ids)
 }
df$id<-createid(df$Nom)

同样,如果 Y 编写以下函数,我会收到错误 错误 in d$var : object of type 'closure' is not subsettable

 createid<-function(d,var){
    x<- transform(d$var, id=match(d$var, unique(d$var)))
    ids<-paste0("id_",x[,2])
    return(ids)
  }
 df$id<-createid(d,Nom)

我认为你应该在 R 中编写函数的方式有一些我不理解的地方,尤其是当你在数据框内调用变量时。有人可以帮我弄这个吗? 谢谢

【问题讨论】:

  • 能否也包括创建df?像 df
  • 通常transform 第一个参数是data 本身,而不是向量。 IE。 transform(df, id=match(Nom, unique(Nom)))[-(2:3)]
  • 如果您分别传递 dvar 参数,d$var 将无法在函数中工作。请改用d[['var']]。这就是为什么您会收到 Error in d$var : object of type 'closure' is not subsettable 错误
  • @LyzanderR 请作为解决方案发布
  • @akrun 谢谢 Akrun :)。它只解决了他的一半问题,另一半由你解决哈哈。这就是我没有发帖的原因。

标签: database r function unique


【解决方案1】:

您可以在不使用transform 的情况下执行此操作。正如@LyzanderR 在cmets 中提到的,最好使用d[[var]] 而不是d$var

createid <- function(d, var){
            d$id <- match(d[[var]], unique(d[[var]]))
             d }
createid(df, 'Nom')
#   Nom Var1 Var2 id
#1  N1  v11  v12  1
#2  N2    .    .  2
#3  N2    .    .  2
#4  N3  V32  V32  3

或者如果你真的想使用$,那么你可以使用eval(parse(,但是这条路线不推荐,也没有那么简单。

   createid1 <- function(d, var){
                 m1 <- match.call()
                 e1 <- eval(parse(text=paste0(deparse(m1$d),'$',m1$var)))
                 d$id <- match(e1, unique(e1))
                 d}

   createid1(df, 'Nom')
   #  Nom Var1 Var2 id
   #1  N1  v11  v12  1
   #2  N2    .    .  2
   #3  N2    .    .  2
   #4  N3  V32  V32  3

或者代替eval(parse

  createid2 <- function(d, var){
    args <- as.list(match.call())
    e1 <- eval(args$var, d)
    d$id <- match(e1, unique(e1))
    d
   }

 createid2(df, Nom)
 #  Nom Var1 Var2 id
 #1  N1  v11  v12  1
 #2  N2    .    .  2
 #3  N2    .    .  2
 #4  N3  V32  V32  3

【讨论】:

  • 非常感谢,这似乎工作得很好。作为一般规则,是否总是不可能在使用参数(df,var) 指定的函数内使用df$vardf[['var']]df$var 在函数内部有什么区别?
  • 很好的答案阿克伦。感谢您的发布。要回答 Doon 的问题,您永远不能将 df$var 与单独的 df, var arguments 一起使用。您可以在控制台上输入help['$'] 了解df$vardf[['var']] 之间的区别。
  • 感谢@Lyzander。 Doon_Bogan:我会说,最好使用[[,因为它是免费的,并且在?'[' 中清楚地提到了不同之处。但是如果你想使用$,你可以通过不推荐的eval(parse( 路由。我可以使用该功能更新帖子。
  • @akrun,哦,我不是特别想要$ 运算符。我只是好奇为什么它会在某些情况下起作用,而不是在其他情况下。感谢您的提问!
猜你喜欢
  • 2022-07-05
  • 1970-01-01
  • 1970-01-01
  • 2020-03-06
  • 2013-01-02
  • 2018-05-29
  • 1970-01-01
  • 1970-01-01
  • 2016-01-04
相关资源
最近更新 更多