作者celestialgod (攸蓝)
看板R_Language
标题Re: [问题] plyr
时间Fri Jul 3 12:56:13 2015
※ 引述《psinqoo (零度空间)》之铭言:
: 延伸问题
: 原始资料
: id year cost
: D 2012 120
: E 2013 300
: F 2014 200
: A 2015 155
: E 2011 200
: F 2014 160
: B 2013 165
: B 2015 185
: C 2012 350
: A 2014 310
: E 2014 225
: F 2015 175
: 想变成这样子
: ID 12计数 13计数 14计数 15计数 2012金额 2013金额 2014金额 2015金额 总计数 总金额
: A
: B
: C
: D
: E
: F
: 虽然 资料量少 EXCEL 可以计算
: 我想知道R 是否也能用少量语法做到
# functions for packages
library(reshape2) # dcast
library(data.table) # fread, dcast.data.table
library(dplyr) # summarise, group_by, n, tbl_dt
library(magrittr) # %>%
data_dt = fread("
id year cost
D 2012 120
E 2013 300
F 2014 200
A 2015 155
E 2011 200
F 2014 160
B 2013 165
B 2015 185
C 2012 350
A 2014 310
E 2014 225
F 2015 175") %>% tbl_dt(FALSE)
data_dt %>% dcast.data.table(id ~ year, sum, value.var = "cost") %>%
left_join(
data_dt %>% group_by(id) %>%
summarise(total = sum(cost), num = n())
,"id")
# id 2011 2012 2013 2014 2015 total num
# 1 A 0 0 0 310 155 465 2
# 2 B 0 0 165 0 185 350 2
# 3 C 0 350 0 0 0 350 1
# 4 D 0 120 0 0 0 120 1
# 5 E 200 0 300 225 0 725 3
# 6 F 0 0 0 360 175 535 3
value.var可以不指定,他可以自动选择,注意要用字串,别跟其他dplyr的function搞混
如果fun.aggregate(第三个input)没指定就会用length
dcast.data.table 是data.table的method,data.frame直接用dcast就好,input是一样
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 111.248.28.53
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/R_Language/M.1435899376.A.3B5.html
1F:推 psinqoo: 好厉害~~ 我想问一下 csv是不是要转成 data.table 07/03 13:12
2F:推 psinqoo: 计数方式并入 该在哪加语法 07/03 13:49
不太懂csv转成data.table??
用你能够读进R的方法都可以转吧
计数方法在left_join後面用group_by 去算n()那里
3F:推 psinqoo: 恩.我想表达是 读入後先 <-as.data.table() 07/03 15:15
可以不用转拉,dcast可以直接做data.frame,只是我用fread读进去就是data.table..
4F:推 psinqoo: 原来如此 07/03 18:01
5F:推 dreamreader: dcast果然简洁,原po应该是想要count across year 07/04 01:41
我之前没看清楚,我再补上
# functions for packages
library(reshape2) # dcast
library(data.table) # fread, dcast.data.table
library(dplyr) # summarise, group_by, n, tbl_dt
library(magrittr) # %>%
data_dt = fread("
id year cost
D 2012 120
E 2013 300
F 2014 200
A 2015 155
E 2011 200
F 2014 160
B 2013 165
B 2015 185
C 2012 350
A 2014 310
E 2014 225
F 2015 175") %>% tbl_dt(FALSE)
years = sort(unique(data_dt$year)) %>% as.character
data_dt %>% dcast.data.table(id ~ year, sum, value.var = "cost") %>%
setnames(years, paste0("count_",years)) %>%
left_join(data_dt %>%
dcast.data.table(id ~ year, length, value.var = "cost") %>%
setnames(years, paste0("cost_",years)), "id") %>%
left_join(
data_dt %>% group_by(id) %>%
summarise(total = sum(cost), num = n()), "id")
※ 编辑: celestialgod (123.205.27.107), 07/04/2015 11:58:51
※ 编辑: celestialgod (123.205.27.107), 07/04/2015 11:59:44
6F:推 psinqoo: 感谢 07/07 08:22