2016-09-30 13 views
-1

У меня есть dataframe, который выглядит следующим образом: DF->SumIf и Pivoting в R (reshape2, плавиться, литье, сливаться ..)

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 

И вектор, который выглядит следующим образом: Время < - ПОСЛ (1,8,1)

Мне нужно создать новый dataframe, который выглядит как 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 для каждый раз, d Тип. Его как комбинация sumif, merge, melt/dcast.

Я не могу представить, как их сочетать. особенно когда Time является вектором.

спасибо.

ответ

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