我想从长格式转到宽格式。我的数据类似:
day=c(1,2,3,4,5,6,1,2,3,4,5,6)
site=c('a', 'a', 'a', 'a', 'a', 'a', 'b', 'b', 'b', 'b', 'b', 'b')
value.1=c(1,2,5,7,5,3,9,4,2,8,1,8)
value.2=c(5,4,7,6,2,4,6,9,4,2,5,6)
data=data.frame(day,site,value.1,value.2)
> data
day site value.1 value.2
1 1 a 1 5
2 2 a 2 4
3 3 a 5 7
4 4 a 7 6
5 5 a 5 2
6 6 a 3 4
7 1 b 9 6
8 2 b 4 9
9 3 b 2 4
10 4 b 8 2
11 5 b 1 5
12 6 b 8 6
我想根据网站将其切换为宽屏格式。所以它看起来像这样
> data
day a.value.1 a.value.2 b.value.1 b.value.2
1 1 1 5 9 6
2 2 2 4 4 9
3 3 5 7 2 4
4 4 7 6 8 2
5 5 5 2 1 5
6 6 3 4 8 6
我觉得我应该能够使用reshape
包来做到这一点,但我无法弄清楚
我希望得到一些帮助。 谢谢
答案 0 :(得分:4)
您可以在base R
reshape(data, idvar='day', timevar='site',direction='wide')
# day value.1.a value.2.a value.1.b value.2.b
#1 1 1 5 9 6
#2 2 2 4 4 9
#3 3 5 7 2 4
#4 4 7 6 8 2
#5 5 5 2 1 5
#6 6 3 4 8 6
答案 1 :(得分:4)
可以使用tidyr
& dplyr
个包裹:
library("tidyr")
library("dplyr")
data %>%
gather(labs, values, value.1:value.2) %>%
unite(site2, site,labs, sep = ".") %>%
spread(site2, values)
虽然我必须承认没有太多理由,reshape
效果很好。我只是喜欢tidyr
和dplyr
。
答案 2 :(得分:2)
您遇到dcast
时遇到问题,因为您的数据不够长,已经部分广泛了。如果您melt
采用更长的格式,dcast
可以正常使用:
> data.long = melt(data, id = c("day", "site"))
> head(data.long)
day site variable value
1 1 a value.1 1
2 2 a value.1 2
3 3 a value.1 5
4 4 a value.1 7
5 5 a value.1 5
6 6 a value.1 3
> dcast(data.long, day ~ site + variable)
day a_value.1 a_value.2 b_value.1 b_value.2
1 1 1 5 9 6
2 2 2 4 4 9
3 3 5 7 2 4
4 4 7 6 8 2
5 5 5 2 1 5
6 6 3 4 8 6
答案 3 :(得分:0)
是的,这可以使用'reshape'包来完成:
library(reshape)
# Melt the data to obtain the 'value' labels
dM <- melt(data, id.vars=c('day', 'site'))
# Now concatenate the site and 'value' labels
dM$siteVal <- paste(dM$site, dM$variable, sep=".")
# Cast the data using site-value labels
dSite <- cast(dM, day ~ siteVal)