Вот решение 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
) соответственно. - Я снова иду от широкой к длинной.
- Я объединяю имена переменных из каждого фрейма данных в одну переменную.
- Наконец, я перехожу от длинного к широкому формату (вот где номера строк пригодятся) и опускаю номера строк.