У меня проблемы с перестановкой следующего фрейма данных:
set.seed(45)
dat1 <- data.frame(
name = rep(c("firstName", "secondName"), each=4),
numbers = rep(1:4, 2),
value = rnorm(8)
)
dat1
name numbers value
1 firstName 1 0.3407997
2 firstName 2 -0.7033403
3 firstName 3 -0.3795377
4 firstName 4 -0.7460474
5 secondName 1 -0.8981073
6 secondName 2 -0.3347941
7 secondName 3 -0.5013782
8 secondName 4 -0.1745357
Я хочу изменить его так, чтобы каждая уникальная переменная «name» представляла собой имя строки, с «значениями» в качестве наблюдений вдоль этой строки и «числами» в качестве имен столбцов. Вроде как это:
name 1 2 3 4
1 firstName 0.3407997 -0.7033403 -0.3795377 -0.7460474
5 secondName -0.8981073 -0.3347941 -0.5013782 -0.1745357
Я смотрел melt
и cast
и несколько других вещей, но никто не похоже , чтобы сделать работу.
Ответы:
Используя
reshape
функцию:источник
reshape
идет сstats
. Не говоря уже о том, что это быстрее! =)reshape
является выдающимся примером ужасного API функции. Это очень близко к бесполезному.reshape
комментарии и подобные имена аргументов не все , что полезны. Тем не менее, я обнаружил, что для длинных и широких вам нужно предоставитьdata =
ваш data.frameidvar
= переменная, которая идентифицирует ваши группы,v.names
= переменные, которые станут широкоформатными столбцами,timevar
= переменная, содержащая значения, которые будут добавлены чтобыv.names
в широком формате,direction = wide
иsep = "_"
. Достаточно ясно? ;)Новый (в 2014 году)
tidyr
пакет также делает это просто, так какgather()
/spread()
является условиями дляmelt
/cast
.Edit: Теперь, в 2019 году, tidyr v 1,0 запустил и множество
spread
иgather
на пути устаревания, предпочитая вместо этогоpivot_wider
иpivot_longer
, которые вы можете найти описанные в этом ответе . Продолжайте читать, если вы хотите кратко взглянуть на краткую жизньspread/gather
.Из GitHub ,
источник
tidyr
иreshape2
. Это обеспечивает хорошие примеры и объяснения.Вы можете сделать это с помощью
reshape()
функции или с помощью функцийmelt()
/cast()
в пакете изменения формы. Для второго варианта пример кодаИли используя
reshape2
источник
cast
илиdcast
не будет работать хорошо, если у вас нет четкого столбца «значение». Попробуйте,dat <- data.frame(id=c(1,1,2,2),blah=c(8,4,7,6),index=c(1,2,1,2)); dcast(dat, id ~ index); cast(dat, id ~ index)
и вы не получите то, что ожидаете. Вы должны явно отметитьvalue/value.var
-cast(dat, id ~ index, value="blah")
и,dcast(dat, id ~ index, value.var="blah")
например.Другой вариант, если производительность вызывает беспокойство, это использовать
data.table
расширение функцийreshape2
melt и dcast.( Ссылка: Эффективное изменение формы с использованием data.tables )
И, начиная с data.table v1.9.6, мы можем привести несколько столбцов
источник
data.table
подход самый лучший! очень эффективно ... вы увидите разницу, когдаname
это комбинация из 30-40 столбцов!Используя ваш пример dataframe, мы могли бы:
источник
Другие два варианта:
Базовый пакет:
sqldf
пакет:источник
ValCol <- unique(dat1$numbers);s <- sprintf("MAX(CASE WHEN numbers = %s THEN value ELSE NULL END) `%s`,", ValCol, ValCol);mquerym <- gsub('.{1}$','',paste(s, collapse = "\n"));mquery <- paste("SELECT name,", mquerym, "FROM dat1", "GROUP BY name", sep = "\n");sqldf(mquery)
Используя базовую
aggregate
функцию R :источник
В версии devel
tidyr
‘0.8.3.9000’
естьpivot_wider
иpivot_longer
которая обобщается для изменения формы (long -> wide, wide -> long соответственно) от 1 до нескольких столбцов. Использование данных ОПдлинная колонна -> широкая
-> создал еще один столбец для отображения функциональности
источник
Базовая
reshape
функция работает отлично:куда
idvar
столбец классов, который разделяет строкиtimevar
столбец классов для широкогоv.names
столбец, содержащий числовые значенияdirection
указывает широкий или длинный форматsep
аргумент - это разделитель, используемый междуtimevar
именами классов иv.names
в выходных данныхdata.frame
.Если нет
idvar
, создайте его перед использованиемreshape()
функции:Просто помните, что
idvar
требуется!timevar
Иv.names
часть легко. Вывод этой функции более предсказуем, чем некоторые другие, так как все явно определено.источник
Существует очень мощный новый пакет от ученых-гениальных данных из Win-Vector (ребята, которые сделали
vtreat
,seplyr
иreplyr
)cdata
. Он реализует принципы «скоординированных данных», описанные в этом документе, а также в этом блоге . Идея состоит в том, что независимо от того, как вы организуете свои данные, должна быть возможность идентифицировать отдельные точки данных, используя систему «координат данных». Вот выдержка из недавнего сообщения в блоге Джона Маунта:Сначала мы создадим контрольную таблицу (подробности см. В блоге ), а затем выполним перемещение данных из строк в столбцы.
источник
гораздо проще!
если вы хотите вернуться от широкого к длинному, измените только Широкий на Длинный, без изменений в объектах.
источник