2013-12-10 54 views
0

我想計算R數據框中有效條目的數量(數值),這些條目是由另一個字段分組的每個特定字段(本例中爲「公司」)。計算R數據框中的數值,並按另一個字段分組

Company <- rep(c('A','B','C'),3) 
Dates <- c(rep('20130131',3),rep('20130228',3),rep('20130331',3)) 
F1 <- c(1:3,NA,NA,6:9) 
F2 <- c(21:27,NA,NA) 
F3 <- c(31:39) 
F4 <- c(NA,NA,NA,44:48,NA) 
df <- data.frame(Company, Dates, F1, F2, F3, F4) 

產生的data.frame

> df 

    Company Dates F1 F2 F3 F4 
1  A 20130131 1 21 31 NA 
2  B 20130131 2 22 32 NA 
3  C 20130131 3 23 33 NA 
4  A 20130228 NA 24 34 44 
5  B 20130228 NA 25 35 45 
6  C 20130228 6 26 36 46 
7  A 20130331 7 27 37 47 
8  B 20130331 8 NA 38 48 
9  C 20130331 9 NA 39 NA 

那麼我想知道每個「公司」和各領域的許多日期如何擁有有效的(數字)值。 輸出將看起來像

Company F1 F2 F3 F4 
     A 2 3 3 2 
     B 2 2 3 2 
     C 3 2 3 1 

數據幀是我處理將有大約500家企業,365個日期和45場,所以做事手動是不是一個真正的選擇。

任何想法將不勝感激。

感謝,

回答

2

底液和替代data.table解決方案:

aggregate(cbind(F1,F2,F3,F4) ~ Company, data=df, function(x) sum(!is.na(x)), na.action=na.pass) 
    Company F1 F2 F3 F4 
1  A 2 3 3 2 
2  B 2 2 3 2 
3  C 3 2 3 1 

data.table

dt <- as.data.table(df) 
dt[,lapply(.SD,function(x) sum(!is.na(x))),by=Company,.SDcols=c("F1","F2","F3","F4")] 

    Company F1 F2 F3 F4 
1:  A 2 3 3 2 
2:  B 2 2 3 2 
3:  C 3 2 3 1 
+0

+1。考慮到OP有許多列,'.SDcols'可以被定義爲'setdiff(colnames(dt),「Company」)' – TheComeOnMan

+1

@Codoremifa - 在這種情況下,可能實際上是:'setdiff(colnames(dt),c 「公司」,「日期」))或甚至paste0(「F」,1:4) – thelatemail

0

由於這是一個關於製表的問題,這裏的stacktable選項在「F」列。

x <- cbind(Company = df$Company, 
      stack(df[setdiff(names(df), c("Company", "Dates"))])) 
table(x[complete.cases(x), c(1, 3)]) 
#  ind 
# Company F1 F2 F3 F4 
#  A 2 3 3 2 
#  B 2 2 3 2 
#  C 3 2 3 1 

## OR 
## table(x[complete.cases(x), c("Company", "ind")]) 
相關問題