繁体   English   中英

包装在 function 中并直接运行代码时,我得到了不同的结果

[英]I am getting different results when wrapped in function and run code directly

为了提高效率,我尝试在 r 中使用“函数”,但似乎得到了不同的结果或没有结果。

直接运行时,结果是,

> data1$CI_allergy <- str_extract(data1$CUR_ILL, "allergy") 
> data1$CI_allergy <- ifelse(data1$CI_allergy == "allergy", 1, 0) 
> data1$CI_allergy[is.na(data1$CI_allergy)] <-0 data1$CI_allergy <-
> ifelse(data1$CI_allergy == 0, "N", "Y") 
> 
> table(data1$CI_allergy)

      N       Y 
2714383   21642 

但是,当使用 function 时:

CI_variable <- function(arg1, arg2) {
  data1$arg1 <- str_extract(data1$CUR_ILL, 'arg2') 
  data1$arg1 <- ifelse(data1$arg1 == 'arg2', 1, 0) 
  data1$arg1[is.na(data1$arg1)] <-0
  data1$arg1 <- ifelse(data1$arg1 == 0, "N", "Y") 
  return(table(data1$arg1))
}

CI_variable(CI_allergy, allergy)

    N 
2736025 

我猜测错误发生在str_extract的 str_extract CI_variable中,但不确定。 有没有人遇到过类似的问题并解决了?

由于原始代码包含str_extract ,它是tidyverse的一部分,因此这里有另一种方法。

首先,一些玩具数据(请参阅如何制作可重现的示例)。

library(tidyverse)
df <- tribble(
   ~Cur_ILL,
  "something bad",
  "something allergy",
  "darkside",
  NA_character_
)

然后我们可以使用 tidyverse 的几个特性来获取(动态)汇总统计信息,如下所示

get_CI <- function(data, col, type){
  data %>%
    count("has_{type}" := ifelse(str_detect({{ col }}, type) %in% T, "Y", "N"))
}
get_CI(df, Cur_ILL, "allergy")

  has_allergy     n
  <chr>       <int>
1 N               3
2 Y               1

解释:

  1. count是计算组出现次数的快捷方式(此处为“Y”和“N”)。 它的 output 是一个 data.frame,对于大多数用例来说,它比表格更容易使用。
  2. walrus-operator :=使用glue package 样式变量名称。 这里是"has_{type}" ,它将类型参数插入到字符串中。 这使得区分表更容易。
  3. 拥抱{{作为快捷方式来指示插入变量名
  4. x %in% TNA转换为FALSE

最后,不需要显式的 return 语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM