铸造多于一个值变量 R

Casting with more that one value variable R

我想从长格式转到宽格式。我的数据看起来像这样:

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 包做到这一点,但我想不出来

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

您可以在 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

您在使用 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

是的,这可以使用 '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)

可以使用 tidyrdplyr 软件包:

library("tidyr")
library("dplyr")
data %>% 
  gather(labs, values, value.1:value.2) %>% 
  unite(site2, site,labs, sep = ".") %>% 
  spread(site2, values) 

虽然我必须承认没有太多理由,但 reshape 效果很好。我只喜欢 tidyrdplyr.