Сопоставление значений из нескольких столбцов в одном фрейме данных с вводом второго фрейма данных и создание столбцов - PullRequest
0 голосов
/ 30 мая 2019

У меня есть 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
...

со всеми значениями, перечисленными в var.1-var.4 в df1 в вар. А df2.

Я хочу сопоставить var.a из df2 по всем столбцам, перечисленным в df1, а затем добавить эти столбцы в 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 Ответ

1 голос
/ 30 мая 2019

Вот решение 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>

Создано в 2019-05-30 пакетом Представить (v0.3.0)

Это немногозапутанный, но я постараюсь объяснить.

  • Сначала я превращаю номера строк в столбцы, так как это поможет мне собрать данные обратно в самом конце.
  • Я иду от широкого к длинному формату для df1.
  • Я присоединяюсь df2 к df1 на основе var.a и var.1 (теперь называется value) соответственно.
  • Я снова иду от широкой к длинной.
  • Я объединяю имена переменных из каждого фрейма данных в одну переменную.
  • Наконец, я перехожу от длинного к широкому формату (вот где номера строк пригодятся) и опускаю номера строк.
...