Re: [问题] 二维的资料如何转换回一维

楼主: locka (locka)   2017-04-20 03:35:24
我不知道怎么直接产生wide form的测试资料
(主要是rank1,2,3抽出不放回不知道怎么写)
所以我先用成long table再转成wide table... :P
library(dplyr)
library(tidyr)
# 产生测试资料:
set.seed(10)
name1 <- c("jane", "zack", "andy", "albee", "may")
name2 <- c("jona", "candy", "clair", "ben", "bobby")
# long table
dat <- data.frame(Time=rep(seq(Sys.Date(), length.out=5, by="1 day"),each=6),
Class=rep(rep(c("xxxx","yyyy"),each=3),5),
Rank=rep(sapply(1:3,function(x)paste0("rank",x)),10),
Student=c(sample(namel,size=3,replace=F),
sample(name2,size=3,replace=F),
sample(name1,size=3,replace=F),
sample(name2,size=3,replace=F),
sample(name1,size=3,replace=F),
sample(name2,size=3,replace=F),
sample(name1,size=3,replace=F),
sample(name2,size=3,replace=F),
sample(name1,size=3,replace=F),
sample(name2,size=3,replace=F)))
# 转成wide table
dat <- dat %>% spread(Rank,Student)
#####
> dat
Time Class rank1 rank2 rank3
1 2017-04-20 xxxx andy zack albee
2 2017-04-20 yyyy ben jona bobby
3 2017-04-21 xxxx zack may albee
4 2017-04-21 yyyy clair bobby candy
5 2017-04-22 xxxx jane andy zack
6 2017-04-22 yyyy clair jona ben
7 2017-04-23 xxxx zack albee andy
8 2017-04-23 yyyy ben bobby candy
9 2017-04-24 xxxx andy may albee
10 2017-04-24 yyyy candy ben bobby
#####
(OK,终于可以开始回答问题了XD)
1. wide table 转成long table
long <- dat %>% gather(Rank,Student,-c(Time,Class))
%>% arrange(Time,Class) %>% mutate(Rank=substr(Rank,5,5))
主要是gather(),后面arrange()跟mutate只是整理起来好看而已
#####
> long
Time Class Rank Student
1 2017-04-20 xxxx 1 andy
2 2017-04-20 xxxx 2 zack
3 2017-04-20 xxxx 3 albee
4 2017-04-20 yyyy 1 ben
5 2017-04-20 yyyy 2 jona
6 2017-04-20 yyyy 3 bobby
7 2017-04-21 xxxx 1 zack
8 2017-04-21 xxxx 2 may
9 2017-04-21 xxxx 3 albee
10 2017-04-21 yyyy 1 clair
...
#####
2. long table 转成 wide table (spread by Time)
res2 <- long %>% spread(Time,Rank,fill="")
#####
> res2
Class Student 2017-04-20 2017-04-21 2017-04-22 2017-04-23 2017-04-24
1 xxxx albee 3 3 2 3
2 xxxx andy 1 2 3 1
3 xxxx jane 1
4 xxxx may 2 2
5 xxxx zack 2 1 3 1
.....
#####
个人觉得只要从long table出发,要怎么转都不难。
(没记错的话tidy data的原则大概就是整成类似long table的样子)
※ 引述《chy0253350 (chy)》之铭言:
: [问题类型]:
:
: 程式咨询(我想用R 做某件事情,但是我不知道要怎么用R 写出来)
:
: [问题叙述]:
: 我有一笔资料大致上是这样的格式:
: Time Class rank1 rank2 rank3
: 2017/4/6 XXXX A1 B1 D1
: 2017/4/7 YYYY A2 C2 B2
: 2017/4/7 XXXX A1 C1 E1
: 2017/4/7 YYYY B2 A2 C2
: A1, B1, C1, A2, C2....都是人名,分别为XXXX和YYYY班的学生。
: 所以第一笔资料就是4/6号,XXXX班的学生,第一名是A1、第二名是B1,最后是D1。
: 但是这样的资料无法制作折线图观察学生们在这两天的排名进退步状况,
: 实际资料的时间会横跨两周,班级、人名和排名也都较多。
: 所以,会希望资料能转换成:
: Time Class student rank
: 2017/4/6 XXXX A1 1
: 2017/4/6 XXXX B1 2
: 2017/4/6 XXXX D1 3
: 2017/4/6 YYYY A2 1
: 2017/4/6 YYYY B2 3
: 2017/4/6 YYYY C2 2
: 2017/4/7 XXXX A1 1
: 2017/4/7 XXXX C1 2
: 2017/4/7 XXXX E1 3
: 2017/4/7 YYYY A2 2
: 2017/4/7 YYYY B2 1
: 2017/4/7 YYYY C2 3
: 如此资料才可以绘制折线图吧?
: 过去有用过dplyr进行筛选或比对等功能,
: 不过现在这种格式就不知道该怎么用了...
: ==============================================================
: 透过reshape2的melt顺利转换成长表格了,
: 那么我能否再转换成:
: student 2017/4/6 2017/4/7
: A1 1 1
: B1 2
: C1 2
: D1 3
: E1 3
: A2 1 2
: B2 3 1
: C2 2 3
: 我记得应该很容易阿,可是怎么觉得自己变好笨..

Links booklink

Contact Us: admin [ a t ] ucptt.com