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