dplyr用动态列进行汇总

时间:2018-11-05 05:30:10

标签: r dynamic dplyr

我正在尝试对我的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”上。为什么会这样,以及如何解决它,以便它在实际列而不是字符串上进行计算?

2 个答案:

答案 0 :(得分:0)

我认为您应该查看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也是方差函数。我把头发扯了很多遍,只是因为它弄乱了一些程序包或自定义功能。

答案 1 :(得分:-1)

我最终用点解决了

i.e.
pull_table %>%
select(var=(dots=column_i)) %>%
    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()