【问题标题】:using lapply on a data table within a function in R在 R 中的函数内的数据表上使用 lapply
【发布时间】:2019-03-20 15:41:49
【问题描述】:

我目前正在编写一段代码,如果应用了特定的数据清理标准,该代码将计算一组研究参与者中丢失了多少观察结果。这个具体的例子与确保每项研究的年龄比例平衡有关。在这段代码中,我将测试两个年龄下降标准(比率为 4 和 5)。

鉴于包含每个研究参与者的所有数据的数据表 (cgf.dt) 和要测试的两个年龄下降标准 (age.drop.criteria),我希望我的函数计算每个年龄标准丢失了多少,并将结果数字作为列表输出。

下面是我写的代码:

age.drop.criteria <- c(4, 5)
age_ratio_check <- function(cgf.dt, age.drop.criteria) {
  age.dt<-cgf.dt
  message("there are ",
          age_count<-age.dt[abs(age_ratio-1)>age.drop.criteria] %>%      
            uniqueN(by=c('nid', 'source', 'admin_1')),
          " groups that have unreasonable age ratio. \n see admin 1s below:")
  age.dt[abs(age_ratio-1)>age.drop.criteria, paste0(ihme_loc_id, "->",  
                                                    admin_1) %>% table]
  age.dt <- age.dt[!(abs(age_ratio-1)>age.drop.criteria)]

}
lapply(age.drop.criteria, age_ratio_check)

运行此代码后,我收到以下错误:

eval(lhs, parent, parent) 中的错误:找不到对象“age_ratio”

我检查了我的数据表并且存在变量 age_ratio。我想知道是否有人可以帮助我解决此错误并让我的代码正常运行。感谢您花时间阅读我的帖子!

【问题讨论】:

  • lapply(X, FUN, ...)FUN(X[[1]], ...) 一样构建函数,但您似乎想使用第二个参数来获得乐趣。你可以更明确一点:lapply(age.drop.criteria, function(x) age_ratio_check(cgf.dt, x))
  • 那是难以阅读的代码,更不用说理解了。我会避免在 data.table [] 调用 tidyverse 管道 &gt;%&gt;
  • @Frank 感谢您的解释。我在我的代码中尝试了这个,但我仍然得到同样的错误。

标签: r function lapply


【解决方案1】:

你的函数中没有age_ratio的定义,伙计。

检查这部分代码:

 message("there are ",
          age_count<-age.dt[abs(age_ratio-1)>age.drop.criteria] %>%      
            uniqueN(by=c('nid', 'source', 'admin_1')),
          " groups that have unreasonable age ratio. \n see admin 1s below:")

  age.dt[abs(age_ratio-1)>age.drop.criteria, paste0(ihme_loc_id, "->",  
                                                    admin_1) %>% table]
  age.dt <- age.dt[!(abs(age_ratio-1)>age.drop.criteria)]

abs(age_ratio-1) - 没有定义这个变量'age_ratio'

您应该明白,在您的情况下没有变量捕获。您应该通过参数传递它或使用 global.env 在函数体中检索它。

【讨论】:

    猜你喜欢
    • 2020-04-04
    • 1970-01-01
    • 2020-09-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-01
    • 1970-01-01
    • 2013-10-15
    相关资源
    最近更新 更多