r - 如何按时间聚合并保持不同聚合值在一个区间内所占的百分比?
问题描述
我对 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 |
有没有办法做到这一点?任何帮助表示赞赏!
解决方案
碱基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
推荐阅读
- php - 检查 JSON 是否有 Given Key
- python - Python-我的数据集包含日期时间列,它不允许我进行任何处理
- c# - 如何从存储过程中提取数据并动态创建 zip 文件夹并添加 csv 文件
- swift - Apple 应用内配置(将卡添加到钱包)
- flutter - 我可以创建 Get.find<>() 的单个实例吗?
- java - Flink 去重和 processWindowFunction
- datatable - 成功时数据表复制标题
- vue.js - Nuxt 手表不重定向
- javascript - 将 Loader 放入数据网格打字稿中
- python - 如何从 Scrapy Selector 中删除子元素?