无法处理VECSXP类型的对象?

时间:2015-05-20 18:14:58

标签: r error-handling dplyr

当尝试在数据集上使用dplyr的n_distinct函数时,我遇到了这个错误:

cannot handle object of type VECSXP

导致此错误的原因可能是什么,我该如何避免?我希望这里有足够的信息来回答这个问题,我会提供更多的信息,但我甚至不知道在哪里关注。

谢谢!

1 个答案:

答案 0 :(得分:3)

我不确定您的数据是什么样的,但我怀疑您在n_distinct上尝试使用list时希望将矢量作为输入(VECSXP是< em> C 表示 R list):

set.seed(123)
x <- sample(1:3, 7, replace=TRUE)
df1 <- data.frame(x)
df1$y <- list(x)
##
R> dplyr::n_distinct(df1$x)
[1] 3
##
R> dplyr::n_distinct(df1$y)
Error: cannot handle object of typeVECSXP

您的错误似乎是从here生成的:

// [[Rcpp::export]]
SEXP n_distinct(SEXP x){
    int n = Rf_length(x) ;
    if( n == 0 ) return wrap(0) ;
    SlicingIndex everything(0, n);
    boost::scoped_ptr<Result> res( count_distinct_result(x) );
    if( !res ){
        stop( "cannot handle object of type %s", type2name(x) );
    }
    return res->process(everything) ;
}

同样,不确定你的代码是什么样的,但我认为你正在做类似的事情

R> dplyr::n_distinct(Dt[,1,with=F])
#Error: cannot handle object of typeVECSXP

而不是

R> dplyr::n_distinct(Dt[[1]])
##[1] 2

并且由于第一个案例返回data.table(因此是list),

R> Dt[,1,with=F]
   x
1: 1
2: 2
R> class(Dt[,1,with=F])
[1] "data.table" "data.frame"

而不是原子矢量,

R> Dt[[1]]
[1] 1 2
R> class(Dt[[1]])
[1] "integer"

您收到错误。

library(data.table)
Dt <- data.table(x=1:2, y=3:4)