Полезный ответ @Akron:
reshape2::melt(as.matrix(testdata))
Вопрос "Но почему?" часть:
У вас есть важная информация в ваших именах строк, которые не обычно являются хорошим местом для хранения важной информации. Нам нужна эта информация, когда мы меняемся. Тогда возникает вопрос, почему melt
использует эту информацию, если мы вводим матрицу, а не кадр данных?
Причина в том, что melt
— это универсальная функция, которая отправляет метод (также известный как более конкретная функция) в зависимости от типа данных, которые вы в нее вводите. Итак, если m
является матрицей и вы вызываете melt(m)
, то R фактически выполняет melt.matrix(m)
. И наоборот, если df
является фреймом данных и вы вызываете melt(df)
, то R фактически выполняет melt.data.frame(df)
. Эти две функции -- melt.matrix()
и melt.data.frame()
-- обрабатывают имена строк по-разному; Метод melt.matrix
использует эти имена строк так, как вы хотите, а метод melt.data.frame
— нет. Итак, чтобы получить желаемый результат, вам нужно передать матрицу (а не кадр данных) в melt
.
Просто чтобы продемонстрировать, если бы у нас была информация об идентификаторе, хранящаяся в столбце нашего data.frame (как в testdata2
ниже), а не в виде имен строк (как в testdata
выше), то мы готовы к работе с точки зрения ввода. кадр данных в melt
:
testdata2 <- data.frame(
ID = 1:10,
year2001 = rnorm(10),
year2002 = rnorm(10),
year2003 = rnorm(10) )
reshape2::melt(testdata2, "ID")
reshape2::melt(testdata2, id.vars="ID", measure.vars=2:4) #equivalently, but verbosely
person
DanY
schedule
10.08.2018
melt
melt(as.matrix(testdata))
или сtidyverse
rownames_to_column(testdata, 'rn') %>% gather(key, val, -rn)
- person akrun   schedule 11.08.2018melt(as.matrix(testdata))
работает. Но зачем мне конвертировать в матрицу? Мне это тоже кажется неэффективным, потому что тогда, очевидно, мне нужно сразу же преобразовать в datatable. Но если это так, я сделаю это. - person User878239   schedule 11.08.2018melt
. то естьsetDT(testdata, keep.rownames = TRUE)
, а затем используйтеmelt
- person akrun   schedule 11.08.2018data.frame(as.table(as.matrix(testdata)))
или дажеcbind(ID=rownames(testdata),stack(testdata))
- person Onyambu   schedule 11.08.2018