Re: [問題] 如何整理合併資料並計算個數

作者: celestialgod (天)   2016-04-07 22:19:36
※ 引述《atomo (Mr.Wu)》之銘言:
:
: ctrl + y 可以刪除一整行,請將不需要的內容刪除
: [問題類型]:
:
: 程式諮詢(我想用R 做某件事情,但是我不知道要怎麼用R 寫出來)
:
: [軟體熟悉度]:
: 請把以下不需要的部份刪除
: 新手(沒寫過程式,R 是我的第一次)
: [問題敘述]:
: 原始資料:
: Firm stage year
: A early 2012
: A early 2012
: A later 2012
: A later 2013
: B early 2012
: B early 2013
: B early 2013
: B later 2012
: C early 2013
: C early 2013
: C later 2013
: .......
: 想讓資料會按公司名稱和年度去計算當年度的early以及later的數目
: 想變成:
: Firm year early later
: A 2012 2 1
: A 2013 0 1
: B 2012 1 0
: B 2013 2 0
: C 2013 2 1
: 不好意思,剛開始使用r 不太清楚如何敘述問題和寫程式碼,目前是使用dplyr的
: group_by 和 n() 兩個來練習不知道方向有無錯誤,謝謝有任何需要補充的我在補充
方向正確,只是要把early跟later拉出來
還需要會用tidyr的spread或是data.table的dcast.data.table或是base的unstack
也可以用reshape2的dcast,甚至是reshape的cast
另外,硬幹的話,還可以用split + lapply(llply) + merge (full_join)
下面用tidyr的spread示範:
library(data.table)
library(magrittr)
library(dplyr)
library(tidyr)
DT <- fread('Firm stage year
A early 2012
A early 2012
A later 2012
A later 2013
B early 2012
B early 2013
B early 2013
B later 2012
C early 2013
C early 2013
C later 2013')
DT %>% group_by(Firm, year, stage) %>%
summarise(stage_count = n()) %>%
spread(stage, stage_count, fill = 0)
# Source: local data table [5 x 4]
# Groups:
#
# Firm year early later
# (chr) (int) (dbl) (dbl)
# 1 A 2012 2 1
# 2 A 2013 0 1
# 3 B 2012 1 1
# 4 B 2013 2 0
# 5 C 2013 2 1
# 寫一下硬幹的方法:
split(DT2, DT2$stage) %>% llply(function(x){
x %>% setnames("stage_count", unique(.$stage)) %>% select(-stage)
}) %>% {full_join(.[[1]], .[[2]])} %>%
mutate_each(funs(mapvalues(., NA, 0)))
作者: atomo (Mr.Wu)   2016-04-07 22:25:00
跪著研究中,有問題再問大大,謝謝另外請問一下是如何知道是計算stage的個別數目而不是year項呢?
作者: carl090105 (Jing)   2016-04-07 23:07:00
最簡潔就是用DT%>%dcast.data.table(Firm + year ~ stage)
作者: LinNine (0-9)   2016-04-10 11:00:00
推卡爾大大

Links booklink

Contact Us: admin [ a t ] ucptt.com