【问题标题】:Matching values from multiple columns in 1 data frame to key in second data frame and creating columns将 1 个数据帧中多列的值与第二个数据帧中的键匹配并创建列
【发布时间】:2019-05-30 18:18:30
【问题描述】:

我有 2 个数据框。一个 (df1) 看起来像这样:

 var.1 var.2 var.3 var.4
1     7     9     1     2
2     4     6     9     7
3     2     NA    NA    NA

另一个(df2)看起来像这样:

 var.a var.b var.c var.d
1     1     b     c     d
2     2     f     g     h
3     4     j     k     l
3     7     j     k     z
...

在 df2 的 var.a 中的 df1 中的 var.1-var.4 中列出的所有值。

我想在 df1 中列出的所有列中匹配 df2 中的 var.a,然后使用新的/组合的列名将这些列添加到 df1。例如,它看起来像这样:

 var.1 var1.b var1.c var1.d ... var.4 var4.b var4.c var4.d
1     7     j     k     z         2     f     g     h
2     4     j     k     l         7     j     k     z
3     2     f     g     h         NA    NA    NA    NA

提前致谢!

【问题讨论】:

    标签: r merge match


    【解决方案1】:

    这是tidyverse 解决方案。首先,我定义数据框。

    df1 <- read.table(text = " var.1 var.2 var.3 var.4
                      1     7     9     1     2
                      2     4     6     9     7
                      3     2     NA    NA    NA", header = TRUE)
    
    
    df2 <- read.table(text = "  var.a var.b var.c var.d
    1     1     b     c     d
    2     2     f     g     h
    3     4     j     k     l
    4     7     j     k     z", header=TRUE)
    

    然后,我加载库。

    # Load libraries
    library(tidyr)
    library(dplyr)
    library(tibble)
    

    最后,我重构了数据。

    # Manipulate data
    df1 %>% 
      rownames_to_column() %>% 
      gather(variable, value, -rowname) %>% 
      left_join(df2, by = c("value" = "var.a")) %>% 
      gather(foo, bar, -variable, -rowname) %>% 
      unite(goop, variable, foo) %>% 
      spread(goop, bar) %>% 
      select(-rowname)
    #> Warning: attributes are not identical across measure variables;
    #> they will be dropped
    

    给出,

    #>   var.1_value var.1_var.b var.1_var.c var.1_var.d var.2_value var.2_var.b
    #> 1           7           j           k           z           9        <NA>
    #> 2           4           j           k           l           6        <NA>
    #> 3           2           f           g           h        <NA>        <NA>
    #>   var.2_var.c var.2_var.d var.3_value var.3_var.b var.3_var.c var.3_var.d
    #> 1        <NA>        <NA>           1           b           c           d
    #> 2        <NA>        <NA>           9        <NA>        <NA>        <NA>
    #> 3        <NA>        <NA>        <NA>        <NA>        <NA>        <NA>
    #>   var.4_value var.4_var.b var.4_var.c var.4_var.d
    #> 1           2           f           g           h
    #> 2           7           j           k           z
    #> 3        <NA>        <NA>        <NA>        <NA>
    

    reprex package (v0.3.0) 于 2019 年 5 月 30 日创建

    这有点令人费解,但我会尝试解释一下。

    • 我首先将行号转换为一列,因为这将有助于我在最后将数据重新组合在一起。
    • 我将df1 的格式从宽格式转换为长格式。
    • 我分别基于var.avar.1(现在称为value)将df2 加入df1
    • 我又从宽变长了。
    • 我将每个数据帧中的变量名合并为一个变量。
    • 最后,我从长格式变为宽格式(这是行号派上用场的地方)并删除行号。

    【讨论】:

      猜你喜欢
      • 2021-03-10
      • 1970-01-01
      • 2020-10-09
      • 1970-01-01
      • 1970-01-01
      • 2018-05-03
      • 2021-03-07
      • 2018-04-28
      相关资源
      最近更新 更多