循环一个函数,该函数 returns 由另一个变量分组的数据框中的变量列表
Loop a function that returns a list over variables in a dataframe grouped by another variable
作为示例数据集
example.df <- data.frame(
species = sample(c("primate", "non-primate"), 50, replace = TRUE),
treated = sample(c("Yes", "No"), 50, replace = TRUE),
gender = sample(c("male", "female"), 50, replace = TRUE),
var1 = rnorm(50, 100, 5), var2=rnorm(50, 10,5), var3 = rnorm (50, 25, 5))
我正在尝试使用 asbio
包中的 pairw.kw
来计算按变量分组后的 dunn 检验 P 值。
by(example.df,example.df$treated, function(X) pairw.kw(X$var1, X$species, conf = 0.95))
returns 有效结果。
如何修改此代码(或其他方式)以遍历其他数字变量(我的实际数据集中有 23 个)?
编辑:根据@jay.sf 的出色回答,我使用以下代码解决了我的问题。
vars <- colnames(select_if(example.df, is.numeric))
res <- by(example.df, example.df$treated, simplify = FALSE, function(X) sapply(vars, simplify = FALSE, USE.NAMES = TRUE, function(i) pairw.kw(X[[i]], X$species, conf = 0.95)))
res_summary <- res %>% map_depth(2, "summary")
res_summary.df <- do.call(rbind, lapply(sapply(res_summary, `[`, simplify = FALSE, USE.NAMES = TRUE), data.frame))
这会将我唯一需要的摘要对象从 res
转换为易于使用的数据框。
您可以构建一个循环遍历各种变量的 sapply()
。首先,我们需要一个字符向量,其中包含数字名称的名称。
(vars <- names(example.df)[4:6])
# [1] "var1" "var2" "var3"
现在我们把它放在 by(.)
library("asbio")
res <- by(example.df, example.df$treated, function(X) sapply(vars, function(i)
pairw.kw(X[[i]], X$species, conf = 0.95)))
最后您可以 运行 str(res)
查看结果中的内容以及如何访问它。
例如
> res$Yes[[4]]
Diff Lower Upper Decision Adj. P-value
Avg.ranknon-primate-Avg.rankprimate -0.19444 -5.55705 5.16817 FTR H0 0.943345
作为示例数据集
example.df <- data.frame(
species = sample(c("primate", "non-primate"), 50, replace = TRUE),
treated = sample(c("Yes", "No"), 50, replace = TRUE),
gender = sample(c("male", "female"), 50, replace = TRUE),
var1 = rnorm(50, 100, 5), var2=rnorm(50, 10,5), var3 = rnorm (50, 25, 5))
我正在尝试使用 asbio
包中的 pairw.kw
来计算按变量分组后的 dunn 检验 P 值。
by(example.df,example.df$treated, function(X) pairw.kw(X$var1, X$species, conf = 0.95))
returns 有效结果。
如何修改此代码(或其他方式)以遍历其他数字变量(我的实际数据集中有 23 个)?
编辑:根据@jay.sf 的出色回答,我使用以下代码解决了我的问题。
vars <- colnames(select_if(example.df, is.numeric))
res <- by(example.df, example.df$treated, simplify = FALSE, function(X) sapply(vars, simplify = FALSE, USE.NAMES = TRUE, function(i) pairw.kw(X[[i]], X$species, conf = 0.95)))
res_summary <- res %>% map_depth(2, "summary")
res_summary.df <- do.call(rbind, lapply(sapply(res_summary, `[`, simplify = FALSE, USE.NAMES = TRUE), data.frame))
这会将我唯一需要的摘要对象从 res
转换为易于使用的数据框。
您可以构建一个循环遍历各种变量的 sapply()
。首先,我们需要一个字符向量,其中包含数字名称的名称。
(vars <- names(example.df)[4:6])
# [1] "var1" "var2" "var3"
现在我们把它放在 by(.)
library("asbio")
res <- by(example.df, example.df$treated, function(X) sapply(vars, function(i)
pairw.kw(X[[i]], X$species, conf = 0.95)))
最后您可以 运行 str(res)
查看结果中的内容以及如何访问它。
例如
> res$Yes[[4]]
Diff Lower Upper Decision Adj. P-value
Avg.ranknon-primate-Avg.rankprimate -0.19444 -5.55705 5.16817 FTR H0 0.943345