用于计算唯一值的函数不起作用

时间:2015-02-03 15:42:58

标签: r

我只是想知道为什么以下用于在数据框中返回变量的唯一值的简单代码不起作用?

uu<-function(datum,group){
       k=unique(datum$group)
   return(k)
  }

matcars<-mtcars
mm<-uu(matcars,gear)

不幸的是,mm只返回NULL值。有什么建议吗?


library(dplyr) 
##
uu <- function(datum, group) { 
  group1 <- substitute(group) 
  GR <- toString(group1) 
  k <- unique(datum[,GR]) 
  test <- filter(datum,group==k[1]) 
  return(test) 
} 
##
uu(mtcars, gear)

1 个答案:

答案 0 :(得分:1)

我建议使用@akrun和@CathG建议的方法,因为这可能是实现所需结果的最简单且最不容易出错的方法,但如果由于某种原因你坚持使用$运算符在你的函数中,这是一种可行的方法:

uu <- function(datum, group) {
  group <- substitute(group)
  datum <- substitute(datum)
  unique(eval(call("$",datum,group)))
}
##
R> uu(mtcars,gear)
[1] 4 3 5
R> all.equal(unique(mtcars$gear),uu(mtcars,gear))
[1] TRUE
##
R> uu(mtcars,disp)
 [1] 160.0 108.0 258.0 360.0 225.0 146.7 140.8 167.6 275.8 472.0 460.0 440.0  78.7  75.7  71.1 120.1 318.0 304.0 350.0 400.0  79.0
[22] 120.3  95.1 351.0 145.0 301.0 121.0
R> all.equal(unique(mtcars$disp),uu(mtcars,disp))
[1] TRUE

感谢@akrun,这是使用$运算符的另一个选项:

uu <- function(datum, group){ 
  args <- as.list(match.call()) 
  e1 <- eval(args$group, datum) 
  unique(e1) 
} 
##
R> uu(mtcars, gear)
[1] 4 3 5