铸造多于一个值变量 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)
可以使用 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
.
我想从长格式转到宽格式。我的数据看起来像这样:
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)
可以使用 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
.