【问题标题】:Extending an sapply to apply list of variables and saving output as list of data frames in R扩展 sapply 以应用变量列表并将输出保存为 R 中的数据框列表
【发布时间】:2020-12-25 21:42:25
【问题描述】:

我有一个类似于下面例子的数据集,复杂的样本数据。感谢 SO 用户 IRTFM,我能够调整代码并保存结果(我只对总比例感兴趣,而不是置信区间)作为重塑对象以供进一步处理。我想做的是扩展这个 sapply 以生成 20 个其他变量的结果。理想情况下,我想将结果保存为列表中的数据框,因为我认为这是最有效的方法。我的斗争是如何扩展 sapply 以便我可以一次处理多个变量。我考虑过一个包含变量名称的列表的 for 循环,并开始制作这个列表,下面是 var_list,但这似乎不是前进的方向。我宁愿利用 apply 系列,因为我希望将结果存储在列表中。

library(survey) # using the `dclus1` object that is standard in the examples.
library(reshape)
library(tidyverse)

data(api)

stype_t <- sapply( levels(dclus1$variables$stype),
        function(x){ 
           form <- as.formula( substitute( ~I(stype %in% x), list(x=x)))
           z <- svyciprop(form, dclus1, method="me", df=degf(dclus1))
           c( z, c(attr(z,"ci")) )}  ) %>% 
  as.data.frame() %>% slice(1) %>% reshape::melt() %>% dplyr::mutate(value = round(value, digits = 4)*100)

假设您想使用变量奖励重复上述操作。您可以复制这些行并这样做,但效率更高会更好。因此,我首先列出了此示例数据中两个变量的名称列表,但对于如何将此列表应用于上面的代码并将结果保留在数据框列表中,我感到很困惑。我尝试用 lapply 包裹 sapply 但这不起作用,因为我打赌那是错误的。任何建议或想法将不胜感激。

var_list <- list("stype", "awards")

【问题讨论】:

    标签: r lapply sapply


    【解决方案1】:

    而不是 $ 引用命名元素,考虑 [[ 提取器通过字符串引用名称。另外,为动态变量扩展substitute

    # DEFINED METHOD
    df_build <- function(var) {
     sapply(levels(dclus1$variables[[var]]), function(x) { 
         form <- as.formula(substitute(~I(var %in% x), 
                                       list(var=as.name(var), x=x))) 
         z <- svyciprop(form, dclus1, method="me", df=degf(dclus1)) 
         c(z, c(attr(z,"ci")))
     }) %>% 
      as.data.frame() %>% 
      slice(1) %>% 
      reshape::melt() %>% 
      dplyr::mutate(value = round(value, digits = 4)*100) 
    }
    
    # ITERATE THROUGH CHARACTER VECTOR AND CALL METHOD
    var_list <- list("stype", "awards")
    df_list <- lapply(var_list, df_build)
    

    【讨论】:

    • 感谢您的回答,它有效。我不知道 [[ 提取器的功能。
    • 很高兴为您提供帮助。是的,extractor对于向量、矩阵、列表、数据框等来说是一个有用的核心方法。通常用户在$之前学习它。节日快乐,@Maggie,编码愉快!
    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 2015-05-07
    • 1970-01-01
    • 2014-07-10
    • 1970-01-01
    • 2012-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多