我使用管道运算符(%>%)和唯一函数有一些麻烦。
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)"
有什么想法吗?
答案 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)
正在发生的事情是%>%
将df
与x
和.$a
与y
相匹配。
因此,对于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