簡體   English   中英

dplyr使用動態列進行匯總

[英]dplyr summarise with dynamic columns

我正在嘗試對我的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 ,該name可以在dplyr函數中取消引用!! 運營商。 如果您想了解更多信息,請查看quasiquotation doc此tuto

不幸的是,由於我tbl_sql沒有任何tbl_sql ,我無法使用show_query測試。

側面建議:不要將變量命名為“var”,因為var也是方差函數。 我把頭發拉了很多次只是因為這弄亂了一些包或自定義功能。

我最后用圓點解決了它

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()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM