首页 > 解决方案 > 如何按时间聚合并保持不同聚合值在一个区间内所占的百分比?

问题描述

我对 R 比较陌生,如果这太琐碎了,我深表歉意。

我有大致如下所示的数据:

dat <- data.frame(Time =c("12:00:00","12:00:00","12:00:00","14:00:00","14:00:00","14:00:00" ),X = c("A","B","B","A","B","C"))

其中Time是测量时间(记录为 2 小时间隔),X是测量变量。

我想聚合(?)具有相同时间值但保留所有不同X值的行,而不是计算平均值或总和;理想情况下,我想获得每个X值在每个聚合时间间隔中所占的百分比。所以是这样的:

时间 % 一个 % B % C
12:00:00 0.333 0.666 0.0
14:00:00 0.333 0.333 0.333

有没有办法做到这一点?任何帮助表示赞赏!

标签: raggregate

解决方案


碱基R

xt <- t(apply(xtabs(~ Time + X, data = dat), 1, function(z) z/sum(z)))
xt <- cbind(as.data.frame(xt), Time = rownames(xt))
rownames(xt) <- NULL
xt
#           A         B         C     Time
# 1 0.3333333 0.6666667 0.0000000 12:00:00
# 2 0.3333333 0.3333333 0.3333333 14:00:00

dlpyr

library(dplyr)
dat %>%
  count(Time, X) %>%
  mutate(n = n/sum(n)) %>%
  pivot_wider(names_from = "X", values_from = "n") %>%
  mutate(across(-Time, ~ if_else(is.na(.), 0, .)))
# # A tibble: 2 x 4
#   Time         A     B     C
#   <chr>    <dbl> <dbl> <dbl>
# 1 12:00:00 0.167 0.333 0    
# 2 14:00:00 0.167 0.167 0.167

数据表

library(data.table)
datDT <- as.data.table(dat)
out <- dcast(datDT[, .N, by = .(Time, X)][, N := N/sum(N)],
      Time ~ X, value.var = "N"
  )[, (cols) := lapply(.SD, function(z) fifelse(is.na(z), 0, z)), .SDcols = cols]
out
#        Time         A         B         C
#      <char>     <num>     <num>     <num>
# 1: 12:00:00 0.1666667 0.3333333 0.0000000
# 2: 14:00:00 0.1666667 0.1666667 0.1666667

推荐阅读