Re: [問題] 資料加總和參照

作者: celestialgod (天)   2015-11-02 22:13:08
dat = data.frame(ID = sample(LETTERS[1:5], 20, TRUE),
bal = sample(0:200, 20, TRUE), date = sample(c(0, 2013:2015), 20, TRUE))
# normal method
dat2 = subset(dat, dat$date != 0)
out = cbind(tapply(dat$bal, dat$ID, sum), tapply(dat2$date, dat2$ID, min))
data.frame(ID = rownames(out), bal = out[,1], date = out[,2])
# ID bal date
# A A 232 2013
# B B 55 2013
# C C 868 2013
# D D 346 2013
# E E 470 2013
## 注意,這裡如果有ID的年份只有0會出錯!! 會在cbind時出現長度不同~~~
## 這裡或許有人會有更漂亮的解法XD
## 比較好的方式還是透過dplyr吧
# dplyr
library(dplyr)
dat %>% group_by(ID) %>%
summarise(bal = sum(bal), date = min(date[date > 0]))
# ID bal date
# 1 A 232 2013
# 2 B 55 2013
# 3 C 868 2013
# 4 D 346 2013
# 5 E 470 2013
※ 引述《rubyjay (佩佩~)》之銘言:
: [問題敘述]:
: 資料為
: ID bal date
: A 10 2015
: A 30 0
: A 100 2014
: B 0 2013
: B 100 0
: . . .
: . . .
: . . .
: 想要整理成:
: ID bal date
: A 140 2014
: B 100 2013
: . . .
: . . .
: . . .
: 也就是根據同一個ID,bal加總,date取不為0的最小值~
: [程式範例]:
:
: 因很久沒碰,
: 今天先用了
: aggregate(bal~ID,data,sum)
: 這樣子可以得到同一個ID,金額(bal)加總,但日期時(date)的部分不知道怎麼處理。
: 有想說不然就先替除date為0的,然後再用aggregate(date~ID,data,min),
: 但是因為最後我還是要把他和bal放一起去做分類。
: 大部分參考下列網頁摸索出來的~
: https://stat.ethz.ch/R-manual/R-devel/library/stats/html/aggregate.html
: 因為以前大多用R跑模擬,用來分析資料的比較少,原本都用excel,
: 只是資料大(10萬筆以上),受不了excel了~(excel常用樞紐和vlookup)
作者: rubyjay (佩佩~)   2015-11-02 22:30:00
這樣的話 date為0那個bal就不會加總耶~改謝C大,有感覺了,太久沒碰,都不知道參數怎麼使用~Tks
作者: locka (locka)   2015-11-02 23:26:00
感覺dplyr真的好強大。學習了!謝謝!

Links booklink

Contact Us: admin [ a t ] ucptt.com