计算R数据框中的数值,按另一个字段分组

时间:2013-12-10 03:12:10

标签: r count dataframe summary

我想计算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 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

由于这是关于制表的问题,因此在table“F”列之后,stack选项会出现。

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")])