【问题标题】:left join a variable by id in R在R中通过id左连接一个变量
【发布时间】:2017-07-20 04:55:31
【问题描述】:

我有两个表 df1 和 df2。现在我想通过相同的 id 将 df2 的变量 newVar 加入到 df1 中。但问题是 df1 中存在一些 id 而 df2 中没有。

所以我想要那个if df1.id exists in df2, then df1.newVar=df2.newVar, else df1.newVar=0

在 R 中,我尝试过 df1$newVar= ifelse((df1$id %in% df2$id), df2$newVar, 0),但结果并不好。

我也尝试过sqldf('select df1.*, df2.newVar as newVar from df1 left outer join df2 on df2.id= df1.id'),但 R 给出了错误。

这里是一个df1的例子:

id   var1
A     1
A     2
B     1

df2:

id   newVar
A     1
A     1

我希望 df1 的结果看起来像:

id   var1   newVar
A     1       1
A     2       1
B     1       0

【问题讨论】:

  • 也许你应该发布你的数据
  • @VidaWang 好的,已经更新了。
  • (1) 当我使用您发布的数据运行您的 sqldf 语句时,我没有收到任何错误。如果您确实遇到了错误,则可能是您打错了字或其他未显示的内容。 (2) 我确实收到一个警告,但您可以忽略它。或使用旧版本的 RSQLite。 (它是由该软件包的最新版本引入的。)或者只运行两次。我相信它只会在您第一次在会话中使用 sqldf 时发出警告。 (3) 如果要显示输出,则需要使用distinctsqldf("select distinct * from df1 left join df2 using(id)")

标签: r merge left-join


【解决方案1】:

您可以使用 left_join{dplyr} 来完成这项工作。

library("dplyr")
df1 <- data_frame(
  id = c("A", "A", "B"),
  var1 = c(1, 2, 1)
)

df2 <- data_frame(
  id = c("A", "A"),
  newvar = c(1, 1)
)

unique(left_join(df1,df2,by="id"))

结果是:

# A tibble: 3 × 3
     id  var1 newvar
  <chr> <dbl>  <dbl>
1     A     1      1
2     A     2      1
3     B     1     NA

【讨论】:

  • 如果df2有很多变量,我只想要newVar,我该怎么办?
  • @velvetrock 可以先过滤df2中的变量,然后做left-join,比如unique(left_join(df1, select(df2, id, newvar),by="id"))
猜你喜欢
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 1970-01-01
  • 2019-06-23
  • 2023-03-31
  • 2013-08-25
  • 2021-11-25
  • 1970-01-01
相关资源
最近更新 更多