Вот несколько вариантов, все с различными способами перехода от широких к длинным данным.Каждый раз вам нужно выполнить какую-то операцию дважды, потому что вы превращаете результаты в длинные данные и превращаете буквы в длинные данные.Кроме того, вопрос о том, как вы хотите написать свой код, зависит от предпочтений.
Во-первых, с dplyr
и tidyr
, где вы можете использовать gather
и передавать свои данные в одном выражении.select
позволяет изменить имена на V1 и V2.
library(tidyverse)
df_long_gather <- df %>%
gather(key = key1, value = letter, V1:V3) %>%
gather(key = key2, value = score, V4:V6) %>%
select(V1 = letter, V2 = score) %>%
arrange(V1)
head(df_long_gather)
#> # A tibble: 6 x 2
#> V1 V2
#> <chr> <int>
#> 1 A 45
#> 2 A 78
#> 3 A 39
#> 4 B 45
#> 5 B 23
#> 6 B 78
Вы также можете использовать melt
из reshape2
.Вы можете сделать это в два шага (первая версия) или вложить один вызов в другой, чтобы сделать его за один шаг (вторая версия).Вы также можете использовать %>%
трубы, чтобы использовать оба melt
s в одном операторе.
Два шага:
library(reshape2)
melted1 <- melt(df, id.vars = c("V1", "V2", "V3"),
measure.vars = c("V4", "V5", "V6"), variable.name = "key1",
value.name = "score")
melted2 <- melt(melted1, measure.vars = c("V1", "V2", "V3"),
variable.name = "key2", value.name = "V1")
df_long_melt <- data.frame(V1 = melted2$V1, V2 = melted2$score)
head(df_long_melt)
#> V1 V2
#> 1 A 45
#> 2 E 12
#> 3 E 23
#> 4 H 23
#> 5 A 78
#> 6 E 42
Один шаг:
df_long_melt2 <- melt(
melt(df, measure.vars = c("V1", "V2", "V3"), value.name = "key1"),
measure.vars = c("V4", "V5", "V6"), value.name = "key2")[, c(2, 4)]
names(df_long_melt2) <- c("V1", "V2")
head(df_long_melt2)
#> V1 V2
#> 1 A 45
#> 2 E 12
#> 3 E 23
#> 4 H 23
#> 5 B 45
#> 6 F 12