我有一个数据集,部分是面板数据,部分是横截面。
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
)
答案 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"
重复的行。
所有功劳归功于答案的作者。