2016-09-30 1 views
-1

Ich habe ein Datenrahmen, der wie folgt aussieht: df->SUMIF und Verschwenkung in R (reshape2, schmelzen, gegossen, fusionieren ..)

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 

Und ein Vektor, der wie folgt aussieht: < Time - seq (1,8,1)

ich brauche einen neuen Datenrahmen zu erstellen, die wie folgt aussieht 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 

Grundsätzlich für jede Zeit mit countIf ein d Geben Sie ein. Es ist eine Kombination von Sumif, Merge, Melt/DBT.

Ich kann nicht scheinen, wie man diese kombiniert. vor allem, wenn die Zeit ein Vektor ist.

Vielen Dank.

Antwort

1

ist hier eine Kombination aus Schmelze, gegossen, und verschmelzen:

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 
0

Wir table von 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)))) 
verwenden können