Конвертировать 6 столбцов данных в 2 столбца в R - PullRequest
0 голосов
/ 15 мая 2018

В этих данных каждый из 3-х предметов поставил оценку в столбцах 4-6.

> Sample.Score
  V1 V2 V3 V4 V5 V6
1  A  B  C 45 78 39
2  E  F  G 12 42 93
3  E  H  B 23 85 35
4  H  C  F 23 12 64

Как преобразовать его в 2-х столбцах, где он содержит оценки всех возможных предметов, например

> Sample.Score2
  V1 V2
1  A 45
2  B 78
3  C 39
4  E 12

Есть повторяющиеся элементы, но я не хочу их сначала суммировать.

Ответы [ 3 ]

0 голосов
/ 15 мая 2018

Мы можем установить поднабор набора данных, транспонировать его и преобразовать в vector с помощью c, чтобы создать столбцы нового набора данных

data.frame(V1 = c(t(df[1:3])), V2 = c(t(df[4:6])))
#    V1 V2
#1   A 45
#2   B 78
#3   C 39
#4   E 12
#5   F 42
#6   G 93
#7   E 23
#8   H 85
#9   B 35
#10  H 23
#11  C 12
#12  F 64
0 голосов
/ 15 мая 2018

Вот несколько вариантов, все с различными способами перехода от широких к длинным данным.Каждый раз вам нужно выполнить какую-то операцию дважды, потому что вы превращаете результаты в длинные данные и превращаете буквы в длинные данные.Кроме того, вопрос о том, как вы хотите написать свой код, зависит от предпочтений.

Во-первых, с 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
0 голосов
/ 15 мая 2018

Далее я просто дважды использую lapply. Хотя буквы расположены по столбцам (в отличие от выходных данных вашего примера), буквы имеют правильное значение в той же строке.

data.frame(V1 = unlist(lapply(df[, 1:3], cbind)),
           V2 = unlist(lapply(df[, 4:6], cbind)))

#      V1 V2
# V11  A 45
# V12  E 12
# V13  E 23
# V14  H 23
# V21  B 78
# V22  F 42
# V23  H 85
# V24  C 12
# V31  C 39
# V32  G 93
# V33  B 35
# V34  F 64

Используемые данные

df <- read.table(text="V1 V2 V3 V4 V5 V6
     1  A  B  C 45 78 39
     2  E  F  G 12 42 93
     3  E  H  B 23 85 35
     4  H  C  F 23 12 64", head =TRUE, stringsAsFactors = FALSE)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...