我想计算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个字段,因此手动操作并不是真正的选择。
非常感谢任何想法。
谢谢,
答案 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")])