r-我如何按时间进行聚合,并保持不同聚合值在一个区间中所占的百分比

  • 本文关键字:一个 百分比 区间 时间 何按 r aggregate
  • 更新时间 :
  • 英文 :


我对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为测量变量。

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

时间12:00:000.3330.666>td style="ext-align:centre!">0.014:00:000.3330.333

基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

相关内容

最新更新