Select 不同数据框中缺少行
Select missing rows in different dataframes
我有两个数据框:list1
和 list2
>head(list1)
RS_ID CHROM POS REF_ALLELE ALT_ALLELE AF_REF_allsamples
1 rs77599058 1 195680131 C T 0.9996
2 rs73056353 1 195680971 A G 0.9999
3 rs12130880 1 195681419 A T 0.5475
4 rs76457267 1 195681460 A C 0.9993
5 rs10921893 1 195681616 T C 0.5060
6 rs75239769 1 195682022 G A 0.9999
AF_ALT_allsamples AF_REF_onlycontrol AF_ALT_onlycontrol pvalues
1 0.0004 0.9996 0.0004 0.7830
2 0.0001 0.9998 0.0002 0.3740
3 0.4525 0.5442 0.4558 0.0597
4 0.0007 0.9992 0.0008 0.3590
5 0.4940 0.5099 0.4901 0.0302
6 0.0001 1.0000 0.0000 0.5500
>head(list2)
RS_ID CHROM POS REF_ALLELE ALT_ALLELE AF_REF_allsamples
1 rs77599058 1 195680131 C T 0.9996
2 rs73056353 1 195680971 A G 0.9999
3 rs12130880 1 195681419 A T 0.5475
4 rs76457267 1 195681460 A C 0.9993
5 rs10921893 1 195681616 T C 0.5060
6 rs75239769 1 195682022 G A 0.9999
AF_ALT_allsamples AF_REF_onlycontrol AF_ALT_onlycontrol pvalues
1 0.0004 0.9996 0.0004 0.7830
2 0.0001 0.9998 0.0002 0.3740
3 0.4525 0.5442 0.4558 0.0597
4 0.0007 0.9992 0.0008 0.3590
5 0.4940 0.5099 0.4901 0.0302
6 0.0001 1.0000 0.0000 0.5500
> dim(list1)
[1] 235111 10
> dim(list2)
[1] 234520 10
正如您在 dim()
中看到的那样,它们的行数相差 591。我现在想获取一个新数据框,其中包含 list1 中不在 list2 中的所有行(那些 591)
我试过了
> match_diff=list1[!(list1 %in% list2)]
> dim(match_diff)
[1] 235111 10
但如您所见,它告诉我,list1 中的所有行都不同于 list2。
我检查了 str()
是否有根本原因,但两者是相同的(源自相同的原始数据)
我无法按单列进行检查,但必须将每一行作为一个整体进行比较。
这是数据库join
操作。如果您搜索联接,您会发现有关不同类型的更多信息。正如@starja 所说,你想要来自 dplyr 的 anti_join
:
如果您还没有 install.packages('dplyr')
,请安装 dplyr
R> list1 <- data.frame(a=0:5, b=10:15)
R> list2 <- data.frame(a=(0:5)+3, b=(10:15)+3)
R> list1
a b
1 0 10
2 1 11
3 2 12
4 3 13
5 4 14
6 5 15
R> list2
a b
1 3 13
2 4 14
3 5 15
4 6 16
5 7 17
6 8 18
R> list3 <- dplyr::anti_join(list1, list2)
Joining, by = c("a", "b")
R> list3
a b
1 0 10
2 1 11
3 2 12
R>
我有两个数据框:list1
和 list2
>head(list1)
RS_ID CHROM POS REF_ALLELE ALT_ALLELE AF_REF_allsamples
1 rs77599058 1 195680131 C T 0.9996
2 rs73056353 1 195680971 A G 0.9999
3 rs12130880 1 195681419 A T 0.5475
4 rs76457267 1 195681460 A C 0.9993
5 rs10921893 1 195681616 T C 0.5060
6 rs75239769 1 195682022 G A 0.9999
AF_ALT_allsamples AF_REF_onlycontrol AF_ALT_onlycontrol pvalues
1 0.0004 0.9996 0.0004 0.7830
2 0.0001 0.9998 0.0002 0.3740
3 0.4525 0.5442 0.4558 0.0597
4 0.0007 0.9992 0.0008 0.3590
5 0.4940 0.5099 0.4901 0.0302
6 0.0001 1.0000 0.0000 0.5500
>head(list2)
RS_ID CHROM POS REF_ALLELE ALT_ALLELE AF_REF_allsamples
1 rs77599058 1 195680131 C T 0.9996
2 rs73056353 1 195680971 A G 0.9999
3 rs12130880 1 195681419 A T 0.5475
4 rs76457267 1 195681460 A C 0.9993
5 rs10921893 1 195681616 T C 0.5060
6 rs75239769 1 195682022 G A 0.9999
AF_ALT_allsamples AF_REF_onlycontrol AF_ALT_onlycontrol pvalues
1 0.0004 0.9996 0.0004 0.7830
2 0.0001 0.9998 0.0002 0.3740
3 0.4525 0.5442 0.4558 0.0597
4 0.0007 0.9992 0.0008 0.3590
5 0.4940 0.5099 0.4901 0.0302
6 0.0001 1.0000 0.0000 0.5500
> dim(list1)
[1] 235111 10
> dim(list2)
[1] 234520 10
正如您在 dim()
中看到的那样,它们的行数相差 591。我现在想获取一个新数据框,其中包含 list1 中不在 list2 中的所有行(那些 591)
我试过了
> match_diff=list1[!(list1 %in% list2)]
> dim(match_diff)
[1] 235111 10
但如您所见,它告诉我,list1 中的所有行都不同于 list2。
我检查了 str()
是否有根本原因,但两者是相同的(源自相同的原始数据)
我无法按单列进行检查,但必须将每一行作为一个整体进行比较。
这是数据库join
操作。如果您搜索联接,您会发现有关不同类型的更多信息。正如@starja 所说,你想要来自 dplyr 的 anti_join
:
如果您还没有 install.packages('dplyr')
dplyr
R> list1 <- data.frame(a=0:5, b=10:15)
R> list2 <- data.frame(a=(0:5)+3, b=(10:15)+3)
R> list1
a b
1 0 10
2 1 11
3 2 12
4 3 13
5 4 14
6 5 15
R> list2
a b
1 3 13
2 4 14
3 5 15
4 6 16
5 7 17
6 8 18
R> list3 <- dplyr::anti_join(list1, list2)
Joining, by = c("a", "b")
R> list3
a b
1 0 10
2 1 11
3 2 12
R>