2017-07-03 48 views
1

我想写一个R函数来产生频率表,所以我可以标准化格式化等,而不必重复输入它。唯一的问题是我无法正确评估分组变量。功能没有以预期的方式评估变量

下面是一些代码来获得一个小数据集来重现问题:

library(tidyverse) 
id <- sample(1:500, 5) 
factors <- sample(1:3, 5, replace = TRUE) 
data <- data.frame(id, factors) 
freqTable <- function(x, field){ 

    Table <- x %>% 
     group_by(field) %>% 
     summarise(N = n(), Percent = n()/NROW(x)*100) %>% 
     mutate(C.Percent = cumsum(Percent)) 
    return(Table) 
} 
freqTable(data, "factors") 

,这导致:

错误resolve_vars(new_groups,tbl_vars(。数据)):未知 变量来分组:来自:resolve_vars(new_groups, tbl_vars(.data))

我已经也试过:

freqTable <- function(x, field){ 
    Table <- x %>% 
      group_by(paste(field)) %>% 
      summarise(N = n(), Percent = n()/NROW(x)*100) %>% 
      mutate(C.Percent = cumsum(Percent)) 
    return(Table) 
} 

其中一期工程更好一点(因为它没有错误),但仍然正确,实际上并不组的因素,这个输出:

# A tibble: 1 × 4 
    `paste(field)`  N Percent C.Percent 
      <chr> <int> <dbl>  <dbl> 
1  factors  5  100  100 

如果它只是告诉我是该栏中的病例数。有人知道我要去哪里吗?

+1

退房 “有dplyr小品节目”:https://cran.r-project.org/web/packages/dplyr /vignettes/programming.html – sinQueso

回答

1

对不起 - 只是想出了这一个。

group_by_(field)

我认为这可能是与非的标准评价,但我不太懂行的约呢。

此:

freqTable <- function(x, field){ 
+  Table <- x %>% 
+    group_by_(paste(field)) %>% 
+    summarise(N = n(), Percent = n()/NROW(x)*100) %>% 
+    mutate(C.Percent = cumsum(Percent)) 
+ return(Table) 
+ } 

现在给出了这样的:

> freqTable(data, "factors") 
# A tibble: 2 × 4 
    factors  N Percent C.Percent 
    <int> <int> <dbl>  <dbl> 
1  2  2  40  40 
2  3  3  60  100 
+0

你是如何发现它可以使用'paste'?与'as.character'它不 –

+1

嗯,我怀疑从错误消息,它正在评估变量名称的价值,并认为如果我使用粘贴它会输出的值,我需要它的空间值。 – Nick

+0

这是一个很酷的技巧,我不知道它是否适用于其他函数,如聚合,也采用静态名称作为输入。我正在准备一个答案,在那之前我正在重命名该专栏。如果有人能够解释发生了什么,我会很高兴! –