【问题标题】:Join two dataframes to fill the missing data加入两个数据框以填充缺失的数据
【发布时间】:2020-11-13 17:13:10
【问题描述】:

我有两个不同的数据框:

df1 <- tibble(group = c(rep(1, 3), rep(2, 4), rep(1, 3)),
       id = paste0("minutesPrompt", c(1, 2, 3, 1, 2, 3, 4, 1, 2, 3)),
       number = c(rep("a", 3), rep("b", 4), rep("c", 3)),
       minutesPrompt = c(1, 2, 4, 9, 18, 27, 36, 2, 3, 5),
       timestamp = rep("xxxxxx", 10),
       text1 = c("String", rep(NA_character_, 6), rep("String", 3)),
       text2 = c(NA_character_, "String", rep(NA_character_, 5), "String", rep(NA_character_, 2)),
       text3 = c(rep(NA_character_, 2), "String", rep(NA_character_, 7)))

df2 <- tibble(group = rep(2, 7),
              id = paste0("minutesPrompt", c(1, 2, 3, 4, 1, 2, 3)),
              number = c(rep("b", 4), rep("x", 3)),
              minutesPrompt = NA,
              timestamp = rep("xxxxxx", 7),
              text1 = c("String", rep(NA_character_, 6)),
              text2 = c(rep(NA_character_, 2), "String", rep(NA_character_, 4)),
              text3 = c(NA_character_, "String", rep(NA_character_, 5)))
  1. df1(第一张图片)真的很大:这个数据框由很多变量组成,包括 3 个不同组的值。对于每个参与者,它还有 7 行,由 id 表示。
  2. df2(第二张图片)相反仅包含仅针对一组显示的变量。数据集之间的区别还在于 df1 有一些缺失值(黄色)。应传输到这些空单元格中的字符串包含在 df2(橙色)中。

我的计划是进行完全连接,以便我可以用提供的 df2 值替换 df1 中关于“timestamp”、“text1”、“text2”直到“text7”的缺失信息。我试过这个:

full_join(df1, df2) %>%
   group_by("id", "number")

但是,这不会用 df2 中的字符串替换我丢失的单元格(以黄色突出显示)。

【问题讨论】:

  • 如果您包含一个简单的reproducible example,其中包含可用于测试和验证可能解决方案的示例输入和所需输出,则更容易为您提供帮助。我们不需要您的所有真实数据,只需一些小数据就可以帮助您了解正在发生的事情。
  • 您没有指定要加入的字段。默认情况下,dplyr::full_join 将连接两个集合之间的任何公共列名,不一定是 idnumber
  • 谢谢芭菲。 R 将我所有的 df2 变量作为我猜的键。但是如何指定列?
  • @NadineM。在这种情况下,您只需添加参数by = character vector of column names,因此在这种情况下,full_join(df1,df2, by = c("id", "number")) 将加入 id 和 number
  • 请在代码问题中给出minimal reproducible example--cut & paste & runnable code,包括最小的代表性示例输入为代码;期望和实际输出(包括逐字错误消息);标签和版本;明确的规范和解释。给出尽可能少的代码,即您显示的代码可以通过您显示的代码扩展为不正常的代码。 (调试基础。)对于包含 DBMS 和 DDL(包括约束和索引)和输入为格式化为表格的代码的 R/SQL。 How to Ask 暂停总体目标的工作,将代码砍到第一个表达式,没有给出你期望的内容,说出你的期望和原因。

标签: r dataframe join dplyr merge


【解决方案1】:

我们可以使用data.table包:

library(data.table)

setDT(df1)[setDT(df2), `:=` ( timestamp  = i.timestamp,
                              text1 = i.text1,
                              text2 = i.text2,
                              text3 = i.text3 ), 
            on = .(id, number)][] ## may wanna add `group` column to `on` arguments
#>    group             id number minutesPrompt timestamp  text1  text2  text3
#> 1:     1 minutesPrompt1      a             1    xxxxxx String   <NA>   <NA>
#> 2:     1 minutesPrompt2      a             2    xxxxxx   <NA> String   <NA>
#> 3:     1 minutesPrompt3      a             4    xxxxxx   <NA>   <NA> String
#> 4:     2 minutesPrompt1      b             9    xxxxxx String   <NA>   <NA>
#> 5:     2 minutesPrompt2      b            18    xxxxxx   <NA>   <NA> String
#> 6:     2 minutesPrompt3      b            27    xxxxxx   <NA> String   <NA>
#> 7:     2 minutesPrompt4      b            36    xxxxxx   <NA>   <NA>   <NA>
#> 8:     1 minutesPrompt1      c             2    xxxxxx String String   <NA>
#> 9:     1 minutesPrompt2      c             3    xxxxxx String   <NA>   <NA>
#> 10:    1 minutesPrompt3      c             5    xxxxxx String   <NA>   <NA>

【讨论】:

  • 非常感谢,您的代码运行良好。而且我不必添加“组”列:-)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-12-17
  • 1970-01-01
  • 2021-03-11
  • 1970-01-01
  • 1970-01-01
  • 2018-03-22
相关资源
最近更新 更多