[英]Sumif and Pivoting in R (reshape2, melt, cast, merge..)
我有一个看起来像的数据框: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 的组合。
我似乎无法弄清楚如何将这些结合起来。 特别是当时间是一个向量时。
谢谢你。
这是熔化、铸造和合并的组合:
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
我们可以使用来自base R
table
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))))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.