2013-12-10 51 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")]) 
相关问题