2016-11-21 17 views
1

我想要計算每個id的一個非常大的數據集一個月的概率,我在論壇中與「mutate函數」來到這裏,但它並不真的以我想要的方式工作。我的數據看起來相似,我要計算的P列:mutate r條件與data.frame作爲過濾器

ID Month Day  E P 
1 200701 20070101 .3 .333 
1 200701 20070102 .5 .333 
1 200701 20070105 .5 .333 
1 200702 20070106 .6 1 
2 200701 20070101 .4 .5 
2 200701 20070103 .3 .5 

對我的考驗我已經子集的ID和月,然後簡單地用1 /長度(DF $月)。 我現在的想法是,提取所有ID:

u <- subset(df, !duplicated(df$ID)) 
s <- subset(df, !duplicated(df$Month)) #Month is defined as date variable 

,然後用一個公式推類似變異他們:

mutate(df, p = 1/length(df$ID == u & df$month ==s)) 

這並不不幸的是工作。

或者我必須做一個循環?

+0

請顯示你想要的輸出。 – nicola

+2

所以這個'df%>%group_by(ID,Month)%>%mutate(P = 1/n())' – Sotos

+1

只使用'base R','df $ P < - (df,1/ave seq_along(ID),身份證,月,FUN =長度))' – akrun

回答

0

使用data.table

library(data.table) 
setDT(dt)[, P := (1/.N) ,by = c("ID","Month")] 
# > dt 
# ID Month  Day E   P 
#1: 1 200701 20070101 0.3 0.3333333 
#2: 1 200701 20070102 0.5 0.3333333 
#3: 1 200701 20070105 0.5 0.3333333 
#4: 1 200702 20070106 0.6 1.0000000 
#5: 2 200701 20070101 0.4 0.5000000 
#6: 2 200701 20070103 0.3 0.5000000 

使用dplyr:@Sotos也寫了這個答案。並且他先寫它

library(dplyr) 
dt %>% 
    group_by(ID,Month) %>% 
    mutate(1/n()) 

#  ID Month  Day  E  1/n() 
# (int) (int) (int) (dbl)  (dbl) 
#1  1 200701 20070101 0.3 0.3333333 
#2  1 200701 20070102 0.5 0.3333333 
#3  1 200701 20070105 0.5 0.3333333 
#4  1 200702 20070106 0.6 1.0000000 
#5  2 200701 20070101 0.4 0.5000000 
#6  2 200701 20070103 0.3 0.5000000 
+0

@Sotos我想保證你是第一次寫這篇文章,但即使我有這樣的想法......我真的沒有複製..其實我昨天在這裏學習n()昨天在這裏.. –

+1

不用擔心。我相信你:) – Sotos

+0

謝謝索托斯和喬爾! – Max