在r中使用unique()函数中的管道不起作用

时间:2018-03-21 13:54:46

标签: r function magrittr

我使用管道运算符(%>%)和唯一函数有一些麻烦。

df = data.frame(
  a = c(1,2,3,1),
  b = 'a')

unique(df$a) # no problem here
df %>% unique(.$a) # not working here
# I got "Error: argument 'incomparables != FALSE' is not used (yet)"

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

正在发生的事情是%>%获取左侧的对象并默认将其提供给函数的第一个参数,然后将提供其他参数。这是一个例子:

df = data.frame(
  a = c(1,2,3,1),
  b = 'a')

MyFun<-function(x,y=FALSE){
  return(match.call())
}
> df %>% MyFun(.$a)
MyFun(x = ., y = .$a)

正在发生的事情是%>%dfx.$ay相匹配。

因此,对于unique,您的代码被解释为:

unique(x=df, incomparables=.$a)

解释了错误。对于您的情况,您需要在运行unique之前提取a。如果您想与%>%保持一致,可以使用df %>% .$a %>% unique()但显然还有很多其他方法可以使用{{1}}。

答案 1 :(得分:3)

正如其他答案所述:df %>% unique(.$a)相当于df %>% unique(.,.$a)

要强制点显式,你可以这样做:

df %>% {unique(.$a)}
# [1] 1 2 3

来自magrittr

的替代选项
df %$% unique(a)
# [1] 1 2 3

或者可能说明显而易见的事情:

df$a %>% unique
# [1] 1 2 3