我在两个数据框中有两列,其中较长的一列包含另一列的所有元素。现在我想删除较长列中不与另一列重叠的元素以及相应的行。我使用以下方法确定了“差异”:
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是我想要删除的行数(diff的长度),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 :(得分:0)
有更好的方法!您所描述的相当于左连接或内连接。但在R中,实现它的方法是使用merge命令:
## 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'))
E.g。
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