1

我想检查 data.frame() 中的一行是否与现有行重复。正如这里已经指出的那样,一种方法可能是使用重复功能。但是,如果我正在使用该功能,则会收到以下错误:

Error: argument 'incomparables != FALSE' is not used (yet)

在一封相当古老的邮件中,有人指出这实际上是 R 中的一个错误(更多信息在这里)。我的 data.frame() 看起来像这样:

data.frame(val1=int,val2=int,val3=int,val4=float);

我想知道问题到底是什么,因为我的data.frame中似乎没有“NA”值,因为

?duplicate

指出。这可能是一个非常愚蠢的问题,但我对 R 很陌生,并且很高兴获得有关此问题的任何提示!

在此先感谢,迈克尔

PS:我已经按照建议提供了一个示例

table <- NULL;

foo <- function(n, d, nh, v){
  newEntry <- data.frame(node_i=n, node_j=nh, dst=d, phi=v);

  if(length(table != 0)){
    if(!duplicated(table, newEntry)){
      add(n, nh, d, v);
    }else{
      print("it is a duplicate!")    
    }
  }else{
    add(n, nh, d, v);
  }
}

add <- function(n, d, nh, v){
  rbind(table, data.frame(node_i=n, node_j=nh, dst=d, phi=v)) ->> table;
}

bar <- function(){
  foo(23,42,5,4.0);
  print(table);
  foo(22,42,5,4.0);  
  print(table);
  foo(23,42,5,4.0);
  print(table);
}

但是,这似乎根本不是 duplicate() 的问题。如果我尝试添加另一行sigh ,我会得到同样的错误。

4

1 回答 1

0

如果您将duplicatedfunction替换为match_dffrom plyr,则该问题应该得到解决。

library(plyr) # for match_df
table <- NULL;

foo <- function(n, d, nh, v){
  newEntry <- data.frame(node_i=n, node_j=nh, dst=d, phi=v);

  if(length(table != 0)){
    if(nrow(plyr::match_df(table, newEntry))){
      add(n, nh, d, v);
    }else{
      print("it is a duplicate!")    
    }
  }else{
    add(n, nh, d, v);
  }
}

add <- function(n, d, nh, v){
  rbind(table, data.frame(node_i=n, node_j=nh, dst=d, phi=v)) ->> table;
}

bar <- function(){
  foo(23,42,5,4.0);
  print(table);
  foo(22,42,5,4.0);  
  print(table);
  foo(23,42,5,4.0);
  print(table);
}

输出

> bar()
node_i node_j dst phi
1     23     42   5   4
Matching on: node_i, node_j, dst, phi
[1] "it is a duplicate!"
node_i node_j dst phi
1     23     42   5   4
Matching on: node_i, node_j, dst, phi
[1] "it is a duplicate!"
node_i node_j dst phi
1     23     42   5   4
> table
node_i node_j dst phi
1     23     42   5   4                  
于 2017-03-21T07:10:42.497 回答