我为我的一项常规任务编写了一个函数。我将尝试重复我的问题。以下是我的数据外观的随机样本。它是函数dput(mydataframe)的输出
structure(list(respid = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 10), ssd = c(0,
225, 236, 0, 221, 0, 0, 269, 265, 0), tea = c(228, 0, 269, 0,
258, 241, 0, 222, 0, 256), juice = c(0, 236, 0, 236, 236, 0,
236, 225, 242, 296), vad = c(236, 235, 0, 235, 235, 0, 235, 258,
0, 236), energy = c(0, 235, 236, 235, 0, 236, 235, 0, 236, 0)), .Names = c("respid",
"ssd", "tea", "juice", "vad", "energy"), row.names = c(NA, -10L
), class = c("tbl_df", "tbl", "data.frame"))
现在,我的目标是编写一个函数来过滤“ ssd”列中的非零行。然后看起来像这样
我在R中编写了以下函数
SoT <- function(df,key) {
df2 <- df %>% dplyr::filter(key > 0)
df3 <- janitor::adorn_totals(df2, where = "row")
df4 <- tail(df3,1) %>% janitor::adorn_percentages(denominator = "row") %>% janitor::adorn_pct_formatting()
return(df4)
}
我想要的输出只是列总数之和的百分比(在对ssd> 0进行过滤之后)。在上面的函数中,我只是给函数2个输入。 1是数据框,另一个是我要过滤的“变量名”。我正在这样调用函数:
SoT(df1, "ssd")
在下面的图片中,我想要的结果是绿色的,但是我得到了黄色的。
这意味着代码中的“过滤器功能”不起作用。但是,如果我简单地逐行使用它而不是将其包装在函数中,则一切工作正常。有什么建议吗?
我没有删除图像(仅供参考),但是我已按照建议使数据和代码可再现。
答案 0 :(得分:1)
使用_params= new WorkerQueryParameters()
_repo.Setup(x => x.GetAll(_params)).Returns(workersq);
IQueryable<Worker> tst = _repo.Object.GetAll(_params);
var OkResponse = _controller.GetAllWorkers(_params);
进行编程时(例如,指定要过滤的dplyr
),您需要弄清楚要从哪个环境定义key
。
https://dplyr.tidyverse.org/articles/programming.html
在这种情况下,要使用传递给函数的key
,需要执行两个步骤:
1)使用key
引用key
参数
2)使用enquo()
这些共同告诉dplyr您要使用传递到函数中的!!
,而不要使用可能在函数外部定义的其他key
。
key