Re: [問題] 依照條件,計算欄位,合併欄位

作者: celestialgod (天)   2015-11-05 12:14:15
直接用dplyr解決吧
可以參考z-4-14的資料整理套件系列文 或是在板上/dplyr
library(dplyr)
※ 引述《JJabrams (JJ)》之銘言:
: [問題敘述]:
: 請簡略描述你所要做的事情,或是這個程式的目的
: 我在計算大量資料, 但是不知道如何使用
: 舉例:
: S020 S025 A029 Freq
: 1 1995 8401995 0 863
: 3 1995 8401995 1 679
: 2 1999 8401999 99 456
: 4 1999 8401999 1 744
: 希望可以在A029旁邊依照A029的值,增加他的權重ex
: (我不知道要怎麼不用for迴圈的方式直接在column寫function並增加欄位)
: S020 S025 A029 Weight Freq
: 1 1995 8401995 0 0.5 863
: 3 1995 8401995 1 2 679
: 2 1999 8401999 99 0 456
: 4 1999 8401999 1 2 744
以下DT表示你該問題的資料,class建議用data.table,可以避免複製問題
DT %>% mutate(Weight = weight_cal_func(~~))
想要按照想要的順序就自己調換一下
DT %>% mutate(Weight = weight_cal_func(~~)) %>%
select(S020, S025, A029, Weight, Freq)
或是
dt_names = names(DT)
dt_names = c(dt_names[1:3], "Weight", dt_names[4])
DT %>% mutate(Weight = weight_cal_func(~~)) %>%
select_(dots = dt_names)
: 然後希望可以計算 Weight * Freq的值
: (這個我知道可以用data table的 dt[,value:= Freq * Weight] 解)
: S020 S025 A029 Weight Freq Value
: 1 1995 8401995 0 0.5 863 431.5
: 3 1995 8401995 1 2 679 1358
: 2 1999 8401999 99 0 456 0
: 4 1999 8401999 1 2 744 1488
DT %>% mutate(Value = Freq * Weight)
: 最後依照 S020的年份作加總,並只選需要的欄位
: S020 S025 Freq Value
: 1 1995 8401995 1542 1789.5
: 4 1999 8401999 1200 1488
DT %>% group_by(S020) %>% summarise(Freq = sum(Freq),
Value = sum(Value), S025 = unique(S025))
後記:
原來是斜對面的捧U阿XDD,你好你好
作者: JJabrams (JJ)   2015-11-05 12:34:00
謝謝斜對面的大大!!

Links booklink

Contact Us: admin [ a t ] ucptt.com