我正在尝试对我的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”上。为什么会这样,以及如何解决它,以便它在实际列而不是字符串上进行计算?
答案 0 :(得分:0)
我认为您应该查看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
,可以在!!
运算符的dplyr函数中将其取消引用。如需更多信息,请查看the quasiquotation doc或this 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()