5

我发现自己在 R 中多次执行“条件左连接”。举个例子;如果您有两个数据框,例如:

> df
    a b
  1 1 0
  2 2 0

> other.df
    a b
  1 2 3

目标是最终得到这个数据框:

> final.df
    a b
  1 1 0
  2 2 3

到目前为止我写的代码:

c <- merge(df, other.df, by=c("a"), all.x = TRUE)
c[is.na(c$b.y),]$b.y <- 0
d<-subset(c, select=c("a","b.y"))
colnames(d)[2]<-b

最终得到我想要的结果。

有效地在四行中执行此操作会使代码非常不透明。有没有更好、更简单的方法来做到这一点?

4

2 回答 2

1

这里有两种方法。在这两种情况下,第一行都会进行左合并,返回所需的列。在这种情况下,merge我们必须设置名称。两行中的最后一行将NAs替换为0

合并

res1 <- merge(df, other.df, by = "a", all.x = TRUE)[-2]
names(res1) <- names(df)
res1[is.na(res1)] <- 0

sqldf

library(sqldf)
res2 <- sqldf("select a, o.b from df left join 'other.df' o using(a)")
res2[is.na(res2)] <- 0
于 2012-07-10T22:53:30.323 回答
0

分两行:

c <- merge(df, other.df,all=T)
c=c[which(!duplicated(c$a)),]

因此,这会从两个数据集中获取值,并从第二个数据集中省略 id 重复的行。我不确定哪个是左哪个是对的,所以如果你想要另一个:翻转数据并做同样的事情。

c=c[length(c$a):1,]
c=c[which(!duplicated(c$a)),]
于 2012-07-06T21:48:23.417 回答