以下是数据:
v1-v4
问题: 如何转置数据
am
和group
中的值设为列变量v1-v4
变量按group metric 2015-10-31 2015-11-30 2015-12-31
A v1 693 618 229
A v2 803 715 994
A v3 700 200 720
A v4 17% 38% 19%
B v1 524 249 539
B v2 859 965 543
B v3 302 215 332
B v4 77% 54% 57%
...
我想要产生的结果:
name <- mydata$am
data <- as.data.frame(t(mydata[, -1]))
colnames(mydata) <- name
到目前为止我尝试了什么:
group
这不会按照我想要的方式处理{{1}}变量。
感谢您的帮助。
答案 0 :(得分:6)
基本的想法是首先采用“长”格式,然后采用“宽”格式。
以下是一些方法....
melt
+ dcast
library(data.table) ## or library(reshape2)
dcast(melt(as.data.table(mydf), id.vars = c("am", "group")),
group + variable ~ am, value.var = "value")
<强> recast
强>
(这与上面基本相同,但只需一步。)
library(reshape2)
recast(mydf, group + variable ~ am, id.var = c("am", "group"))
gather
+ spread
library(dplyr)
library(tidyr)
mydf %>%
gather(key, value, v1:v4) %>%
spread(am, value)
<强> reshape
强>
reshape(cbind(mydf[c(1, 2)], stack(mydf[-c(1, 2)])),
direction = "wide", idvar = c("group", "ind"), timevar = "am")