Транспонировать определенные связанные столбцы в R - PullRequest
0 голосов
/ 13 октября 2018

Я новичок в R. Я безуспешно пытался сделать транспонирование фрейма данных.Пробовал использовать t (dataframe), melt (dataframe), но не получал вывод, как я хочу.

Исходный фрейм данных выглядит следующим образом

CAT1   CAT2   VAL1   VAL2
A1     A2     BLUE   BLUE
B1     B2     GREEN  GREEN
C1     C2     BLUE   BLUE

Я хочу транспонировать этот фрейм данных таким образом, чтобы он выглядел следующим образом, и переменные группировки VAL1 и VAL2 работают.

VAL    CAT

BLUE   A1    
       A2
BLUE   C1
       C2
GREEN  B1
       B2

Мне интересно, достижимо ли это.

Вот код для создания первого набора данных:

dt <-data.frame('CAT1' = c('A1','B1','C1'),
                'CAT2' = c('A2','B2','C2'),
                'VAL1' = c('BLUE','RED','GREEN'),
                'VAL2' = c('BLUE','RED','GREEN'), stringsAsFactors = FALSE)

Заранее спасибо.

1 Ответ

0 голосов
/ 13 октября 2018

Я думаю, reshape приблизит вас.

dt_long <- reshape(dt, varying = list(c('CAT1','CAT2'),
                                      c('VAL1','VAL2')), 
                       sep = "",
                       direction = "long")
dt_long
#    time CAT1  VAL1 id
#1.1    1   A1  BLUE  1
#2.1    1   B1   RED  2
#3.1    1   C1 GREEN  3
#1.2    2   A2  BLUE  1
#2.2    2   B2 BLACK  2
#3.2    2   C2   RED  3

Теперь вам нужно исключить ненужные столбцы, как в dt_long[, c("CAT1", "VAL1")].

Также, если у вас есть имена столбцов а-ля "CAT1, CAT2, ... CATn", вместо ввода n имен выполните обновление paste0("CAT", 1:n).


На основе нового требования мы можем создать столбец VAL как

dt_long$VAL <- c(rbind(unique(dt_long$VAL1), NA))
#    CAT1  VAL1   VAL
#1.1   A1  BLUE  BLUE
#1.2   A2  BLUE  <NA>
#2.1   B1   RED   RED
#2.2   B2   RED  <NA>
#3.1   C1 GREEN GREEN
#3.2   C2 GREEN  <NA>

Кроме того, для генерации вектора c("VAL11, VAL12, VAL21, VAL22, VAL31, VAL32") мы можем сделать

paste0("VAL", c(sapply(1:3, paste0, 1:2)))
#[1] "VAL11" "VAL12" "VAL21" "VAL22" "VAL31" "VAL32"

Надеюсь, это поможет.

...