2017-03-11 31 views
0

我想根據其類別對數據集應用函數。鑑於以下數據幀按組在列上應用函數

pet <- c(rep("cat",5),rep("dog",5)) 
year <- c(rep(1991:1995,2)) 
karma <- c(5,4,1,1,1,6,4,3,2,6) 
df <- data.frame(pet,year,karma) 

,看起來像這樣

pet year karma 
1 cat 1991  5 
2 cat 1992  4 
3 cat 1993  1 
4 cat 1994  1 
5 cat 1995  1 
6 dog 1991  6 
7 dog 1992  4 
8 dog 1993  3 
9 dog 1994  2 
10 dog 1995  6 

我想在每年的因緣列執行操作。如果我想申請一個功能類似總和,這可以用ddply做到:

ddply(df, .(year),summarize, sum(karma)) 

我將如何把它應用到我寫我自己的函數,例如

calc <- function(d,c){(d*5+c*7)/12} 

其中d是與每隻給定年份的狗的業力對應的值,並且對應於貓的那些值是c

理想情況下,我想在這個數據框中添加五個條目,其中都是,一年以及上述函數計算的karma值。這樣做的最好方法是什麼?

(如果這是微不足道的,但我真的無法找到一個類似的問題,這一次非常抱歉。)

回答

1

您可以使用spread,使您的數據幀寬,然後mutate來實現你的函數

library('tidyr') 
library('dplyr') 
df %>% 
spread(pet, karma, drop = FALSE) %>% 
mutate(karma = calc(dog, cat), pet = "both") %>% 
select(year, pet, karma) %>% 
rbind(df) 
+1

它不應該是鈣(狗,貓)? – bouncyball

+0

是的!好趕上@bouncyball我已經更新了 – Lucy

+0

謝謝。這很好用! – Arc