[英]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
是一個包含id
, some_numeric_variable
和some_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.