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

У меня есть кадр данных, который выглядит следующим образом enter image description here

Я хочу, чтобы датафрейм был преобразован в длинный формат, подобный этому

enter image description here

Это код, который я использую

long_ex <- melt(wide_ex, id.vars = 5, na.rm=TRUE) #wide_ex is wide format dataframe

Однако мой конечный результат выглядит следующим образом

enter image description here

Есть ли способ использовать расплавление без извлечения имен столбцов? С удовольствием примет альтернативные функции, если расплав не подходит для этой работы

Edit: Вывод данных из dput

structure(list(ï..Column1 = c(NA, NA, NA, NA), Column2 = c(NA, 
NA, NA, NA), Column3 = c(NA, NA, NA, NA), Column4 = c(NA, NA, 
NA, NA), Column5 = structure(c(2L, 1L, 4L, 3L), .Label = c("Eric ", 
"Jim", "Matt", "Tim"), class = "factor"), Column6 = c(NA, NA, 
NA, NA), Column7 = structure(c(1L, 3L, 2L, 3L), .Label = c("Eric", 
"Erica", "Mary "), class = "factor"), Column8 = structure(c(3L, 
2L, 1L, 3L), .Label = c("Beth", "Loranda", "Matt"), class = "factor"), 
    Column9 = structure(c(2L, 3L, 1L, 3L), .Label = c("Courtney ", 
    "Heather ", "Patrick"), class = "factor"), Column10 = structure(4:1, .Label = c("Beth", 
    "Heather", "John", "Loranda "), class = "factor"), Column11 = c(NA, 
    NA, NA, NA), Column12 = c(NA, NA, NA, NA), Column13 = c(NA, 
    NA, NA, NA), Column14 = c(NA, NA, NA, NA), Column15 = c(NA, 
    NA, NA, NA)), class = "data.frame", row.names = c(NA, -4L
))

Ответы [ 2 ]

0 голосов
/ 05 января 2019

Аналогично, используя melt для подхода tidyverse

library(tidyverse)
library(data.table)

df %>%
  melt(id.vars=5) %>%
  filter(complete.cases(.)) %>%
  select(c(1,3))

 Column5     value
1    Jim     Eric
2    Eric    Mary 
3    Tim     Erica
4    Matt    Mary 
5    Jim     Matt
6    Eric    Loranda
7    Tim     Beth
8    Matt    Matt
9    Jim     Heather 
10   Eric    Patrick
11   Tim     Courtney 
12   Matt    Patrick
13   Jim     Loranda 
14   Eric    John
15   Tim     Heather
16   Matt    Beth
0 голосов
/ 05 января 2019

Если вы хотите решение R base:

data.frame(name_1 = rep(as.character(wide_ex$Column5), each=nrow(wide_ex)),
    name_2 = as.vector(t(wide_ex[, c("Column7", "Column8", "Column9", "Column10")])))

Я по-прежнему придерживаюсь мнения, что самый лаконичный метод - это расплавление с данными.

library(data.table)
setDT(wide_ex)
melt(wide_ex, id.vars = c("Column5"), na.rm=TRUE)[,variable := NULL][]

Он также предлагает значительное улучшение скорости по сравнению с изменением формы2, если скорость имеет значение.



(Дополнительное объяснение) ... Что с использованием дополнительных []?

A) использование дополнительного [] в data.table известно как сцепление. Это позволяет вам выполнять больше операций с предыдущими [].

Как вы изначально указали, выход расплава приводит к появлению нежелательного столбца (variable). variable := NULL удаляет его. По сути, это то же самое, что делать следующее (на исходном вопросе):

 long_ex <- melt(wide_ex, id.vars = 5, na.rm=TRUE) 
 long_ex$variable <- NULL

Однако использование := делает это по ссылке (и в той же строке).

Цепочка может быть очень полезной, чтобы ваш код был красивым и лаконичным. Скажем, вы хотите упорядочить вывод по первому столбцу (как вы указали в исходном вопросе). Вы можете сделать это так:

melt (wide_ex, id.vars = c ("Column5"), na.rm = TRUE) [, variable: = NULL] [order (Column5)] []

data.table действительно замечательный пакет (особенно если вы имеете дело со средними и большими данными). Если вам интересно, я бы посоветовал прочитать и узнать больше об этом: https://github.com/Rdatatable/data.table/wiki

...