gpt4 book ai didi

r - dplyr 总结动态列

转载 作者:行者123 更新时间:2023-12-04 19:59:10 24 4
gpt4 key购买 nike

我正在尝试对我的 postgres 数据库使用 dplyr 并执行一个简单的功能。如果我直接解析列名一切正常,但是我想动态地执行此操作(即从另一个数据框中对每个列名进行排序

我遇到的问题是前两次计算,我得到了正确的结果

假设第一个动态列称为“id”

pull_table %>%
summarise(
row_count = n(),
distinct_count = n_distinct(var) ,
distinct_count_minus_blank = n_distinct(ifelse(var=="",NA,var)),
maxvalue = max(var),
minvalue = min(var),
maxlength = max(length(var)),
minlen = min(length(var))
) %>%
show_query()

当您看到 sql 时,我得到的错误结果很明显 - 有时 id 周围有 '' 所以它是作为字符串计算的:

<SQL>
SELECT
COUNT(*) AS "row_count",
COUNT(DISTINCT id) AS "distinct_count",
COUNT(
DISTINCT CASE
WHEN ('id' = '') THEN (NULL)
WHEN NOT('id' = '') THEN ('id')
END) AS "distinct_count_minus_blank",
MAX('id') AS "maxvalue",
MIN('id') AS "minvalue",
MAX(LENGTH('id')) AS "maxlength",
MIN(LENGTH('id')) AS "minlen"
FROM "table"

从这个输出中可以看出,有时计算是在列上进行的,但有时只是在字符串“id”上进行。为什么会这样,我该如何解决它,以便它根据实际列而不是字符串进行计算?

最佳答案

我认为你应该看看 rlang::sym(由 dplyr 导入)。

假设 pull_table 是一个包含 idsome_numeric_variablesome_character_variable 列的数据框,您可以这样写:

xx = sym("id")
yy = sym("some_numeric_variable")
ww = sym("some_character_variable")
pull_table %>%
summarise(
row_count = n(),
distinct_count = n_distinct(!!xx) ,
distinct_count_minus_blank = n_distinct(ifelse(var=="", NA, !!xx)),
maxvalue = max(!!yy ),
minvalue = min(!!yy ),
maxlength = max(length(!!ww)),
minlen = min(length(!!ww))
)

sym() 函数将一个string 变量转换为一个name,它可以在dplyr 函数中用! ! 运算符。如果您想了解更多信息,请查看the quasiquotation docthis tuto .

不幸的是,因为我手头没有任何tbl_sql,所以我无法用show_query 测试它。

附带建议:永远不要将变量命名为“var”,因为 var 也是方差函数。仅仅因为这搞砸了一些包或自定义函数,我就把我的头发扯了很多次。

关于r - dplyr 总结动态列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53148816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com