2016-02-25 63 views
1

我在两个数据框中有两列,其中较长的一列包括另一列的所有元素。现在我想删除较长列中不与另一列重叠的元素以及相应的行。我确定的“区别”使用:如何比较两列并删除不重叠的元素?

diff <- setdiff(gdp$country, tfpg$country)

,我试图用两个for循环来完成这件事:

for (i in 1:28) { for(j in 1:123) {if(diff[i] == gdp$country[j]) {gdp <- gdp[-c(j),]}}} 

,其中28是我想删除的行数(长的差异),123是较长列的长度。这是行不通的,错误信息:

Error in if (diff[i] == gdp$country[j]) { : 
    missing value where TRUE/FALSE needed 

那么如何解决这个问题?还是有更好的方法来做到这一点?

非常感谢。


我有所谓的 “GDP” 这里的数据帧:

country wto y1990 y1991 y1992 

Austria 1995 251540 260197 265644 

Belgium 1995 322113 328017 333038 

Cyprus 1995 14436 14537 15898 

Denmark 1995 177089 179392 182936 

Finland 1995 149584 140737 136058 

France 1995 1804032 1822778 1851937 

有123行。 我想用另一个向量中规定的国名来删除行:

diff ["Austria","China",...,"Yemen"] 
+0

你能后的最小输入数据和预期的输出,所以我们可以工作的代码帮助? – Gopala

+0

刚刚更新了例子...不知道它是否有帮助:)谢谢! – Ehan

+0

如果您有:'countriesToDelete < - c('Austria','China','Yemen')',您可以按如下过滤原始df:'gdp [!gdp $ country%in%countriesToDelete,]'。 – Gopala

回答

0

有一个更好的办法!你所描述的相当于左连接或内连接。但在R上的方式来实现它使用合并命令:

## S3 method for class 'data.frame' 
merge(x, y, by = intersect(names(x), names(y)), 
    by.x = by, by.y = by, all = FALSE, all.x = all, all.y = all, 
    sort = TRUE, suffixes = c(".x",".y"), 
    incomparables = NULL, ...) 

你的情况:

merge(gdp, tfpg, by = intersect('country', 'country')) 

例如

x = data.frame(foo = c(1,2,3,4,5), bar=c("A","B","C","D","E")) 
y = data.frame(baz = c(6,7,8,9), bar=c("A","C","E","F")) 
z = merge(x,y,by=intersect('bar','bar')) 

bar foo baz 
1 A 1 6 
2 C 3 7 
3 E 5 8 
+0

'交叉('国家','国家')似乎不必要(只是'by =“国家”'应该做的) –

+0

工程!谢谢!!!两个数据框没有相同的列,所以merge()将tfpg中的列合并到gdp中,但我可以简单地删除它们。而= =“国家”也适用。 – Ehan

相关问题