R 中的 Sumif 和旋转(reshape2、熔化、铸造、合并……)
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
我们可以使用 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))))
我的数据框如下所示: 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
我们可以使用 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))))