删除重复项,条件是列中的值

时间:2019-11-14 12:02:52

标签: r duplicates data.table conditional-statements

我有一个数据集,部分是面板数据,部分是横截面。

 DT <- fread(
    "Val panelID C   D  E   F   iso   year   
    1   A     NA  1  NA  NA  NLD   1998
    1   A     NA  1  NA  NA  NLD   1998
    1   B     NA  2  NA  NA  NLD   1998   
    1   B     NA  2  NA  NA  NLD   1998   
    1   C     NA  3  NA  NA  GRC   2001  
    1   C     NA  3  NA  NA  GRC   2001    
    1   D     NA  4  NA  NA  GRC   2002
    1   D     NA  4  NA  NA  GRC   2002 
    1   E     NA  7  NA  NA  NLD   1999
    1   F     1   NA  1  NA  EUR   2009   
    1   G     0   NA  2  0   EUR   2000    
    1   H     0   NA  2  0   EUR   2001    
    1   I     0   NA  3  2   GBR   2001   
    1   J     0   NA  4  NA  GBR   2002
    0   K     NA  1  NA  NA  NLD   1999
    0   L     NA  2  NA  NA  NLD   2000
    0   K     NA  1  NA  NA  NLD   1999
    0   L     NA  2  NA  NA  NLD   2000   
    0   M     NA  3  NA  NA  GRC   2001   
    0   N     NA  4  NA  NA  GRC   2002 
    0   O     NA  7  NA  NA  NLD   1999
    0   O     NA  7  NA  NA  NLD   1999
    0   P     1   NA  1  NA  EUR   2009   
    0   Q     0   NA  2  0   EUR   2000    
    0   R     0   NA  2  0   EUR   2001    
    0   Q     0   NA  2  0   EUR   2000    
    0   R     0   NA  2  0   EUR   2001 
    0   S     0   NA  3  2   GBR   2001   
    0   T     0   NA  4  NA  GBR   2002",
    header = TRUE
)

对于iso代码NLD,值以某种方式重复了。其他值很好!因此,我想编写仅针对iso=="NLD的代码删除panelID被重复的列。我尝试过:

DT[iso=="NLD", unique(DT, by = "panelID")]

但这以某种方式比我想要的更多。

所需的输出:

 DT <- fread(
    "Val name  C   D  E   F   iso   year   
    1   A     NA  1  NA  NA  NLD   1998
    1   B     NA  2  NA  NA  NLD   1998   
    1   C     NA  3  NA  NA  GRC   2001  
    1   C     NA  3  NA  NA  GRC   2001    
    1   D     NA  4  NA  NA  GRC   2002
    1   D     NA  4  NA  NA  GRC   2002 
    1   E     NA  7  NA  NA  NLD   1999
    1   F     1   NA  1  NA  EUR   2009   
    1   G     0   NA  2  0   EUR   2000    
    1   H     0   NA  2  0   EUR   2001    
    1   I     0   NA  3  2   GBR   2001   
    1   J     0   NA  4  NA  GBR   2002
    0   K     NA  1  NA  NA  NLD   1999
    0   L     NA  2  NA  NA  NLD   2000  
    0   M     NA  3  NA  NA  GRC   2001   
    0   N     NA  4  NA  NA  GRC   2002 
    0   O     NA  7  NA  NA  NLD   1999
    0   P     1   NA  1  NA  EUR   2009   
    0   Q     0   NA  2  0   EUR   2000    
    0   R     0   NA  2  0   EUR   2001    
    0   Q     0   NA  2  0   EUR   2000    
    0   R     0   NA  2  0   EUR   2001 
    0   S     0   NA  3  2   GBR   2001   
    0   T     0   NA  4  NA  GBR   2002",
    header = TRUE
)

1 个答案:

答案 0 :(得分:1)

给出评论中提出的替代方案的答案:

@DavidAremburg:

DT[, if(iso == "NLD") unique(.SD, by = "panelID") else .SD, by = iso]

这种方法对iso == "NLD"进行求值,如果为true,则返回panelID的唯一记录,如果为false,则返回整个表。

@螺母:

DT[!(duplicated(DT) & iso == 'NLD'),]

这种方法可以过滤出与iso == "NLD"重复的行。

所有功劳归功于答案的作者。