r - 将许多函数应用于许多变量(长格式)
问题描述
我已经阅读了几个有关如何将许多不同的函数应用于 data.tables 中的许多不同列的相关主题。 这一篇关于列和组,这里也有类似的一篇。他们都非常有帮助,但我正在寻找一个更优雅的解决方案来解决非常相似的问题。
从以上两个链接,以下代码:
library(data.table)
DT <- data.table(x= rnorm(50), y = rnorm(50), treatment = c(0,1))
vars <- c("x", "y")
my.summary = function(x) c(Mean = mean(x, na.rm = T), Min = min(x, na.rm = T), Q1 = quantile(x, 0.25, na.rm =T),
Median = median(x, na.rm = T), Q3 = quantile(x, 0.75, na.rm=T), Max = max(x, na.rm = T))
summ_stats <- DT[, as.list(unlist(lapply(.SD, my.summary))), .SDcols = vars, by = .(treatment)]
var
按状态生成变量的汇总统计信息treatment
。输出类似于:
x.Mean, y Min, y Q1.25%, ..., x.Max, y.Mean, y.Min, ...., y.Max
x
y
我正在寻找类似的东西,但我想要的东西(使用 data.table 的速度)看起来像:
variable treatment Max Min Q1 Median Q3, Max, p.value
x 0
1
y 0
1
任何建议将不胜感激!
解决方案
从 OP 的输出中,我们可以使用melt
reshape 为“long”格式
library(data.table)
out <- melt(summ_stats, id.vars = 'treatment', measure =
patterns("Mean", "Min", "Q1.25%", "Median", "Q3.75%", "Max"),
value.name = c("Mean", "Min", "Q1.25%", "Median", "Q3.75%", "Max") )[,
variable := c("x", "y")[variable]][]
out[duplicated(variable), variable := ""][]
setcolorder(out, c("variable", setdiff(names(out), "variable")))
out
# variable treatment Mean Min Q1.25% Median Q3.75% Max
#1: x 0 -0.04316915 -1.624365 -0.5417604 -0.16117851 0.4965782 2.229262
#2: 1 0.14239444 -2.904899 -0.7059286 0.27866472 1.2693872 1.696948
#3: y 0 0.32307227 -1.648222 -0.4209979 0.49096737 1.3184009 2.507111
#4: 1 -0.21832078 -1.890027 -0.6968235 -0.08252376 0.3694591 1.034514
或者另一种选择是collap
可以collapse
在简化代码中重塑为更方便的格式
library(collapse)
collap(DT, ~ treatment, list(fmean, fmin, fmedian, fmax), return = "long")
# Function x y treatment
#1: fmean -0.04316915 0.32307227 0
#2: fmean 0.14239444 -0.21832078 1
#3: fmin -1.62436453 -1.64822174 0
#4: fmin -2.90489906 -1.89002714 1
#5: fmedian -0.16117851 0.49096737 0
#6: fmedian 0.27866472 -0.08252376 1
#7: fmax 2.22926220 2.50711115 0
#8: fmax 1.69694788 1.03451432 1
前缀函数已经优化并且f
会非常快
此外,descr
可以获得每组的分位数以及其他描述性统计信息
descr(DT, g = DT$treatment)
推荐阅读
- python - ModuleNotFoundError:没有名为“_pywrap_tensorflow_internal”的模块无法加载本机 TensorFlow 运行时
- ruby - 如何从 Ruby 中的哈希中删除特定值
- javascript - 如何让用户将电影添加到类似于 netflix 的列表中?
- linux - 带有 ubuntu 16.04 add-apt-repository 的 Docker 容器使用 groovy 而不是 xenial
- python - 是否可以将字符串转换为函数对象?
- sql - 查找两个表 BigQuery 之间最近的地理点
- sql - 我需要加入表和匹配参数
- python - 如何将 TensorFlow 模型转换为 tensorflow.js 模型?
- react-native - DrawerNavigation 动态初始路由
- git - 偏移处的未知对象类型 0 - 所有 repo 镜像都已损坏,防止过滤器分支子目录过滤器