2011-05-05 124 views
9

我想知道在每個記錄的出生日期生下的獨特水壩的數量。我的數據幀是類似這樣的:計算獨特因子r

dam <- c("2A11","2A11","2A12","2A12","2A12","4D23","4D23","1X23") 
bdate <- c("2009-10-01","2009-10-01","2009-10-01","2009-10-01", 
      "2009-10-01","2009-10-03","2009-10-03","2009-10-03") 
mydf <- data.frame(dam,bdate) 
mydf 
# dam  bdate 
# 1 2A11 2009-10-01 
# 2 2A11 2009-10-01 
# 3 2A12 2009-10-01 
# 4 2A12 2009-10-01 
# 5 2A12 2009-10-01 
# 6 4D23 2009-10-03 
# 7 4D23 2009-10-03 
# 8 1X23 2009-10-03 

我用aggregate(dam ~ bdate, data=mydf, FUN=length)但它計數所有在特定日期生下

bdate dam 
1 2009-10-01 5 
2 2009-10-03 3 

相反,水壩,我需要有這樣的事情:

mydf2 
    bdate  dam 
1 2009-10-01 2 
2 2009-10-03 2 

您的幫助非常感謝!

回答

12

什麼:

aggregate(dam ~ bdate, data=mydf, FUN=function(x) length(unique(x))) 
+0

非常感謝這一點。 – baz 2011-05-05 02:37:01

4

您也可以運行unique在第一次數據:

aggregate(dam ~ bdate, data=unique(mydf[c("dam","date")]), FUN=length) 

然後你也可以使用table,而不是aggregate,雖然產量略有不同。

> table(unique(mydf[c("dam","date")])$bdate) 

2009-10-01 2009-10-03 
     2   2 
+2

+1首先運行'unique'的好主意。但是請注意,只有'mydf'只包含'dam'和'bdate',這纔會起作用。 – 2011-05-05 03:50:44

+0

@Joshua:那完全正確。我試圖運行我的數據,它不能得到我想要的。您提供的行完全符合我的要求,因爲我的數據包含大約60個其他變量。 – baz 2011-05-05 06:57:14

+0

如果你確實有其他變量,那麼只需使用你想要的兩列。請參閱編輯。 – Aaron 2011-05-05 12:39:18

3

這僅僅是如何思考的問題,以及如何解決這個問題的方法之一的例子。

split.mydf <- with(mydf, split(x = mydf, f = bdate)) #each list element has only one date. 
# it's just a matter of counting unique dams 
unique.mydf <- lapply(X = split.mydf, FUN = unique) 
#and then count the number of unique elements 
unilen.mydf <- lapply(unique.mydf, length) 
#you can do these two last steps in one go like so 
lapply(split.mydf, FUN = function(x) length(unique(x))) 

as.data.frame(unlist(unilen.mydf)) #data.frame is just a special list, so this is water to your mill 

      unlist(unilen.mydf) 
2009-10-01     2 
2009-10-03     2 
+0

不錯的例子:對於那些稍微有點不同的問題的人來說尤其有用,他們發現這個主題,因爲它將步驟分離出來以便於理解。 – Aaron 2011-05-05 13:57:03

0

在dplyr你可以使用n_distinct

library(tidyverse) 
mydf %>% 
    group_by(bdate) %>% 
    summarize(dam = n_distinct(dam))