我有以下数据框,并希望返回“出口”中不是“两者”的所有行。 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)
答案 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))