【问题标题】:Loop a function that returns a list over variables in a dataframe grouped by another variable循环一个函数,该函数返回由另一个变量分组的数据框中的变量列表
【发布时间】:2019-03-01 07:21:42
【问题描述】:

作为示例数据集

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 在按变量分组后计算邓恩检验 P 值。

by(example.df,example.df$treated, function(X) pairw.kw(X$var1, X$species, conf = 0.95))

返回一个有效的结果。

如何修改此代码(或其他方式)以循环其他数字变量(我的实际数据集中有 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 转换我唯一需要的摘要对象,并将其转换为易于使用的数据框。

【问题讨论】:

    标签: r list loops asbio


    【解决方案1】:

    您可以只构建一个循环通过各种变量的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
    

    【讨论】:

    • 感谢您的建议。 Error in split.default(X, group) : first argument must be a vector 运行代码时收到此错误消息。此外,我需要循环的实际变量都有不同的名称,并且没有按顺序命名为 var1、var 2 等等。
    • 不过,使用您提供的示例数据,代码对我来说运行良好。我已经编辑了答案,以便您更轻松地将其调整为您的原始数据。
    • 谢谢。当我第一次运行代码时,我还加载了其他包。当我使用仅dplyrasbio 的全新 R 会话以及加载了基本 R 时,我能够运行它而不会出错。我不确定为什么会这样。我已将此标记为答案。
    • 我使用了以下代码,修改了您发布的代码。(vars &lt;- colnames(select_if(example.df, is.numeric)))res &lt;- 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))) 以保留名称和列表结构。我将如何从“是”和“否”组中提取摘要数据框并将每个变量的结果绑定在一起?谢谢。
    猜你喜欢
    • 2020-12-01
    • 1970-01-01
    • 2017-10-20
    • 2014-08-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    相关资源
    最近更新 更多