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

dt <- data.table(Id=1:4, TopicA_Percent=runif(4,0.0,1.0), TopicB_Percent=runif(4,0.0,1.0), TopicC_Percent=runif(4,0.0,1.0),
             TopicA_Attempted=rnorm(4), TopicB_Attempted=rnorm(4), TopicC_Attempted=rnorm(4),
             TopicA_TimeSpent=rnorm(4), TopicB_TimeSpent=rnorm(4), TopicC_TimeSpent=rnorm(4))

ID TopicA_Percent TopicB_Percent TopicC_Percent TopicA_Attempted TopicB_Attempted TopicC_Attempted TopicA_TimeSpent TopicB_TimeSpent TopicC_TimeSpent
1      0.6639903      0.4219777      0.4099906      -0.09964646       1.05460385       -1.3331776      -1.55929389      -0.83446808      -1.53410657
2      0.7517089      0.2375559      0.8479702       0.25357552      -0.50835127       -0.2126446       0.31249508      -1.33036583      -0.07090781
3      0.1593582      0.5654915      0.1409356      -0.14667119       0.53910258       -0.5661078      -0.02883193       0.60079330      -1.00326670
4      0.6815283      0.1458051      0.8079253      -0.00262729      -0.08975263        0.8448300       1.39846994      -0.03548673      -1.09306706

И превратить это в это:

Id  Topic   Percent  Attempted  TimeSpent
1 TopicA 0.3871205  0.3460178  0.1834476
2 TopicA 0.6431426 -0.6779898 -1.3497432
3 TopicA 0.5538110 -1.4967361  0.2576378
4 TopicA 0.8621070 -1.4911159  1.7140344
1 TopicB 0.4513063  1.2083898  1.4198672
2 TopicB 0.2045888 -1.2631067 -0.4347670
3 TopicB 0.6605945  0.3486036 -0.6111504
4 TopicB 0.5353699 -0.4743263 -0.4719514
1 TopicC 0.7887296  0.3327606  2.2776418
2 TopicC 0.7280900  0.5818754 -0.3294534
3 TopicC 0.7140528 -1.1317054 -1.3284694
4 TopicC 0.1647406  0.5157608 -1.4876869

Я бы предпочел, чтобы решение включало tidyr или reshape2, но, конечно, я рад получить помощь, используя любой метод, и, возможно, я могу экстраполировать из этого, как это сделать, используя одну из вышеупомянутых библиотек. Спасибо!

1
jookyone 24 Апр 2017 в 23:36

2 ответа

Лучший ответ

Мы можем использовать методы data.table, то есть melt, который занимает несколько measure patterns

dM <- melt(dt, measure = patterns("Percent$", "Attempted$", "TimeSpent$"), 
    value.name = c("Percent", "Attempted", "TimeSpent"), variable.name = "Topic")[,
       Topic :=  unique(sub("_.*", "", names(dt)[-1]))[Topic]][]

Или, как сказал @DavidArenburg, компактный вариант будет

dcast(melt(dt, id = "Id"), Id + sub("_.*", "", variable) ~ sub(".*_", "", variable))
1
akrun 24 Апр 2017 в 21:29

Если бы вы хотели использовать tidyr, вы бы использовали

library(tidyr)

dt %>% gather(key, value, -Id) %>%
  separate(key, c("topic", "category")) %>%
  spread(category, value)
3
MrFlick 24 Апр 2017 в 20:47