将一个数据帧中的多个列中的值匹配到第二个数据帧中的键并创建列

时间:2019-05-30 18:18:31

标签: r merge match

我有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

谢谢!

1 个答案:

答案 0 :(得分: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-05-30创建

这有点令人费解,但是我会尽力解释。

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