返回两个数据帧之一的唯一内容

时间:2012-04-18 21:02:42

标签: r dataframe

我有以下数据框,并希望返回“出口”中不是“两者”的所有行。 setdiff似乎没有做到这一点。在这个例子中,我需要一个返回7行的新数据框。我怎么能这样做?

我的部分问题可能是我计算'both',有时会截断尾随的0。 'egress'是另一个数据框。 “both”包含“入口”和“出口”数据帧中的行。

both = merge(ingress,egress,by=c("lat","lng")

出口

       lat       lng
1  13.8333   44.6833
2  31.1429  -81.4710
3  37.4020 -122.0780  (match)
4  33.9553  -83.3937
5  33.9553  -83.3937
6  38.9628  -95.2554
7  18.9667   72.8333
8  38.8147  -77.0647
9  32.5670  -84.9870  (match)
10 30.5670  -85.9870  (match)

入节点

      lat       lng
1 38.8787  -77.1019
2 52.2500   21.0000
3 37.4020 -122.0780
4 40.7811  -74.0648
5 32.5670  -84.9870
6 30.5670  -85.9870

两个

     lat      lng
1 30.567  -85.987   (trailing 0 is truncated)
2 32.567  -84.987   (trailing 0 is truncated)
3 37.402 -122.078   (trailing 0 is truncated)

2 个答案:

答案 0 :(得分:3)

这是我可能会做的。 (如果您担心有时只有一个data.frames会包含尾随零,您可能需要先使用类似sprintf()的内容来使两个data.frames的格式相同。)

A <- apply(egress, 1, paste, collapse="_")
B <- apply(ingress, 1, paste, collapse="_")
egress[! A %in% B, ]
#       lat      lng
# 1 13.8333  44.6833
# 2 31.1429 -81.4710
# 4 33.9553 -83.3937
# 5 33.9553 -83.3937
# 6 38.9628 -95.2554
# 7 18.9667  72.8333
# 8 38.8147 -77.0647

答案 1 :(得分:1)

您可以在ingress上设置虚拟变量,以便以后进行子集化。

ingress$both <- 1
not_both <- merge(egress, ingress, by=c("lat","lng"), all.x = T)
not_both <- subset(not_both, is.na(both))