У меня возникли проблемы с преобразованием моего data.frame
из широкого стола в длинный стол. На данный момент это выглядит так:
Code Country 1950 1951 1952 1953 1954
AFG Afghanistan 20,249 21,352 22,532 23,557 24,555
ALB Albania 8,097 8,986 10,058 11,123 12,246
Теперь я хотел бы превратить это data.frame
в длинный data.frame
. Что-то вроде этого:
Code Country Year Value
AFG Afghanistan 1950 20,249
AFG Afghanistan 1951 21,352
AFG Afghanistan 1952 22,532
AFG Afghanistan 1953 23,557
AFG Afghanistan 1954 24,555
ALB Albania 1950 8,097
ALB Albania 1951 8,986
ALB Albania 1952 10,058
ALB Albania 1953 11,123
ALB Albania 1954 12,246
Я смотрел и уже попытался с помощью melt()
и reshape()
функции , как некоторые люди предлагали в подобных вопросах. Тем не менее, пока я получаю только грязные результаты.
Если это возможно, я хотел бы сделать это с помощью reshape()
функции, так как она выглядит немного приятнее в обращении.
Ответы:
reshape()
требует времени, чтобы привыкнуть, так же какmelt
/cast
. Вот решение с изменением формы, если предположить, что ваш фрейм данных называетсяd
:источник
Три альтернативных решения:
1) с Таблица данных:
Вы можете использовать ту же
melt
функцию, что и вreshape2
пакете (это расширенная и улучшенная реализация).melt
fromdata.table
также имеет больше параметров, чемmelt
-function изreshape2
. Например, вы также можете указать имя переменной-столбца:который дает:
Некоторые альтернативные обозначения:
2) с tidyr:
Некоторые альтернативные обозначения:
3) с reshape2:
Некоторые альтернативные обозначения, которые дают тот же результат:
НОТЫ:
NA
значения, вы можете добавитьna.rm = TRUE
кmelt
, а такжеgather
функции.Другая проблема с данными заключается в том, что значения будут читаться R как символьные значения (как результат
,
чисел). Вы можете исправить это с помощьюgsub
иas.numeric
:Или непосредственно с
data.table
илиdplyr
:Данные:
источник
id
иtime
в ваш фрейм данных,melt
не можете сказать, что вы хотите сделать в этом случае.id.vars
иmeasure.vars
.id.vars
и этоmeasure.vars
можно указать в первом варианте, извините за беспорядок, это моя вина.-c(var1, var2)
...-c(var1, var2)
что эти переменные пропускаются при преобразовании данных из широкого в длинный формат.Используя пакет изменения формы :
источник
С
tidyr_1.0.0
другой вариантpivot_longer
данные
источник
gather
уходит на пенсию иpivot_longer
сейчас является правильным способом для достижения этой цели.Поскольку этот ответ помечен как г-задаваемые вопросыЯ чувствовал , что это было бы полезно разделить другую альтернативу от базовой R:
stack
.Заметьте, однако, что
stack
это не работает сfactor
s - это работает только еслиis.vector
естьTRUE
, и из документации дляis.vector
мы находим, что:Я использую пример данных из ответа @ Jaap , где значения в столбцах года
factor
s.Вот
stack
подход:источник
Вот еще один пример, показывающий использование
gather
fromtidyr
. Вы можете выбрать столбцыgather
, удалив их по отдельности (как я здесь), или указав нужные вам годы.Обратите внимание, что для обработки запятых (и X добавляется, если
check.names = FALSE
не задано), я также используюdplyr
mutate сparse_number
fromreadr
для преобразования текстовых значений обратно в числа. Все они являются частьюtidyverse
и поэтому могут быть загружены вместе сlibrary(tidyverse)
Возвращает:
источник
Вот sqldf решение:
Чтобы сделать запрос без ввода всего, вы можете использовать следующее:
Спасибо Г. Гротендику за его реализацию.
К сожалению, я так не думаю
PIVOT
иUNPIVOT
сработаюR
SQLite
. Если вы хотите написать свой запрос более сложным образом, вы также можете взглянуть на эти сообщения:Использование
sprintf
написания SQL-запросов или передачи переменных вsqldf
источник
Вы также можете использовать
cdata
пакет, который использует концепцию (преобразования) контрольной таблицы:В настоящее время я изучаю этот пакет и нахожу его вполне доступным. Он предназначен для гораздо более сложных преобразований и включает в себя обратное преобразование. Существует учебник доступны.
источник