R 中的 Sumif 和旋转(reshape2、熔化、铸造、合并……)

Sumif and Pivoting in R (reshape2, melt, cast, merge..)

我的数据框如下所示: df->

  Elmt1      Elmt2    Type
1   1          8      Red
2   5          3      Blue
3   5          1      Blue
4   7          2      Red
5   3          2      Red
6   5          2      Red

还有一个看起来像这样的向量: 时间 <- seq(1,8,1)

我需要创建一个看起来像这样的新数据框 newdf->

  Time     Elmt1Red Elemt1Blue Elmt2Red Elmt2Blue
1   1        1          0          0         1 
2   2        0          0          3         0 
3   3        1          0          0         1 
4   4        0          0          0         0 
5   5        1          2          0         0 
6   6        0          0          0         0 
7   7        1          0          0         0
8   8        0          0          1         0 

基本上,对每个时间和类型使用 countif。 它就像 sumif、merge、melt/dcast 的组合。

我似乎想不出如何将它们结合起来。特别是当时间是一个向量时。

谢谢。

这里是熔化、铸造和合并的组合:

library(reshape2)
m <- melt(df1, measure.var=c("Elmt1", "Elmt2"))
newdf <- dcast(m, value ~ variable + Type)
mrg <- merge(data.frame(value=Time), newdf, all.x=TRUE)
mrg[is.na(mrg)] <- 0L
mrg
#   value Elmt1_Blue Elmt1_Red Elmt2_Blue Elmt2_Red
# 1     1          0         1          1         0
# 2     2          0         0          0         3
# 3     3          0         1          1         0
# 4     4          0         0          0         0
# 5     5          2         1          0         0
# 6     6          0         0          0         0
# 7     7          0         1          0         0
# 8     8          0         0          0         1

我们可以使用 table 来自 base R

v1 <- unlist(df[1:2])
lvls <- min(v1):max(v1)
data.frame(Time = lvls, do.call(cbind, lapply(df[1:2], 
          function(x) table(factor(x, levels=lvls), df$Type))))