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