我的数据框看起来像: 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的组合。
我似乎无法想出如何将这些结合起来。特别是当时间是一个向量时。
谢谢。
答案 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))))