使用多个值变量R进行转换

时间:2015-01-22 17:27:08

标签: r reshape

我想从长格式转到宽格式。我的数据类似:

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包来做到这一点,但我无法弄清楚

我希望得到一些帮助。 谢谢

4 个答案:

答案 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效果很好。我只是喜欢tidyrdplyr

答案 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)