2017-04-24 36 views
1

我已经看过很多其他示例,其中使用了聚集,融合或重塑将宽格式表转换为长格式,但通常这些示例非常简单。我需要使用收集/融化/重塑(或其他)功能,从而利用这些数据:R使用tidyr,reshape2将多个列集转换为行

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,但当然,我很高兴得到使用任何方法的帮助,也许我可以从如何使用上述的图书馆之一做推断。谢谢!

+0

所以,如果你为什么您使用更喜欢tidyverse解决'data.table'来创建自己的数据集? –

+0

@DavidArenburg这只是一个帮助生成数据集的片段... – jookyone

回答

1

我们可以使用data.table方法,即melt这需要多个measurepatterns

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)) 
+0

当我运行该代码时出现错误:'解析错误(文本= x)::1:5:意外的INCOMPLETE_STRING' – jookyone

+0

@ user2768331对不起,我没有得到任何错误你的榜样 – akrun

+1

我做了一件愚蠢的,不顾之前的评论。所有现在的工作,感谢您的帮助! – jookyone

3

如果你想使用tidyr你会使用

library(tidyr) 

dt %>% gather(key, value, -Id) %>% 
    separate(key, c("topic", "category")) %>% 
    spread(category, value)