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

时间:2016-09-30 05:12:14

标签: r merge pivot reshape2 sumifs

我的数据框看起来像: 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的组合。

我似乎无法想出如何将这些结合起来。特别是当时间是一个向量时。

谢谢。

2 个答案:

答案 0 :(得分:1)

这是融合,演员和合并的组合:

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

答案 1 :(得分:0)

我们可以使用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))))