我正在try 创建一个函数,该函数给出mrset的统计数据,并且还想添加一些类似的内容,比如如果TOTAL_CASES小于或等于3,则用"--"替换所有列值

我试了一下,但效果不是很好

library(expss)

fun1 <- function(data, varlist, Banner) {
  
  t1 <- eval(rlang::parse_expr(paste0("cross_cpct(data,mrset(",head(varlist,1),"%to%",tail(varlist,1),"),Banner)")))
  replace_less_than_3 <- function(variable) {
    total_cases <- valid_n(t1[[variable]])
    if (total_cases < 3) {
      t1[[variable]][, (variable) := "--"]
    }
  }
  lapply(names(t1)[-1], replace_less_than_3)
  
  return(t1)
}
example <- data.frame(org = c("A", "B", "C", "D", "E", "F", "G"),
                      q1 = c("apple", "apple", NA, "apple", "apple", "apple", NA),
                      q2 = c(NA, NA, NA, "banana", "banana", "banana", NA),
                      q3 = c("orange", NA, "orange", "orange", NA, "orange", NA),
                      region = c("1", "1", "2", "3", "3", "2", "2"))

df <- example
banner <- list(df$region)

debugonce(fun1)
result <- fun1(df, c("q1", "q2", "q3"), banner)


输出应如下所示

1 2 3
apple -- -- --
banana -- -- --
orange -- -- --
#Total cases 2 2 2

推荐答案

你可以通过创建一个逻辑向量来标识那些总数小于或等于2(lte2)的列,然后索引以用所需的替换(这里是"--")替换该列中的所有所需条目.

要在一般情况下(在您的功能之外)执行此操作,请执行以下操作:

x <- cross_cpct(example, mrset(q1 %to% q3), banner)

lte2 <- c(FALSE, x[x$row_labels == "#Total cases", -1] <= 2)
# [1] FALSE  TRUE TRUE  TRUE

x[-nrow(x), lte2] <- "--"

# |              |  1 |  2 |  3 |
# | ------------ | -- | -- | -- |
# |        apple | -- | -- | -- |
# |       banana | -- | -- | -- |
# |       orange | -- | -- | -- |
# | #Total cases |  2 |  2 |  2 |

要将此代码添加到函数中,请执行以下操作:

fun1 <- function(data, varlist, Banner) {
  t1 <- eval(rlang::parse_expr(paste0("cross_cpct(data,mrset(",head(varlist,1),"%to%",tail(varlist,1),"),banner)")))
  lte2_t1 <- c(FALSE, t1[t1$row_labels == "#Total cases", -1] <= 2)
  t1[-nrow(t1), lte2_t1] <- "--"
  t1
}

fun1(df, c("q1", "q2", "q3"), banner)

# |              |  1 |  2 |  3 |
# | ------------ | -- | -- | -- |
# |        apple | -- | -- | -- |
# |       banana | -- | -- | -- |
# |       orange | -- | -- | -- |
# | #Total cases |  2 |  2 |  2 |

如果对扩展样本数据进行测试以包括一个额外的"橙色"条目,则可以看到当总>;2:

example <- data.frame(org = c("A", "B", "C", "D", "E", "F", "G"),
                      q1 = c("apple", "apple", NA, "apple", "apple", "apple", NA),
                      q2 = c(NA, NA, NA, "banana", "banana", "banana", NA),
                      q3 = c("orange", NA, "orange", "orange", NA, "orange", "orange"),
                      region = c("1", "1", "2", "3", "3", "2", "2"))

fun1(example, c("q1", "q2", "q3"), banner)

#   |              |  1 |     2 |  3 |
#   | ------------ | -- | ----- | -- |
#   |        apple | -- |  33.3 | -- |
#   |       banana | -- |  33.3 | -- |
#   |       orange | -- | 100.0 | -- |
#   | #Total cases |  2 |   3.0 |  2 |

R相关问答推荐

有没有方法将琴弦完全捕捉到R中的多边形?

使用预定值列表将模拟数量(n)替换为rnorm()

无法运行通过R中的Auto.arima获得的ARIMA模型

R等效于LABpascal(n,1)不同的列符号

更改默认系列1以更改名称

在某些栏和某些条件下,替换dfs列表中的NA

如果第一个列表中的元素等于第二个列表的元素,则替换为第三个列表的元素

当我们有多个特殊字符时,使用gsub删除名称和代码'

将文件保存到新文件夹时,切换r设置以不必创建目录

无法正确设置动态创建的Quarto标注的格式

线性模型斜率在减少原始数据时提供NA

在不丢失空值的情况下取消列出嵌套列表

'使用`purrr::pwalk`从嵌套的嵌套框架中的列表列保存ggplots时出现未使用的参数错误

我如何使用tidyselect来传递一个符号数组,比如Pivot_Long?

按组内中位数分类

计算使一组输入值最小化的a、b和c的值

TidyVerse中长度不等的列结合向量

基于已有ID列创建唯一ID

如何在R曲线图弹出窗口中更改r和theta标签

如何使用包含要子集的值的列表或数据框来子集多个列?