2016-09-30 22 views
-1

I持って見えるデータフレームのように: DF->SUMIFとピボット(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)

私は毎回 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

我々は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)))) 
から tableを使用することができます
関連する問題