在函数参数中选择列并按列分组

时间:2019-11-27 23:16:37

标签: r

我正在尝试编写一个函数,以便可以输入要在总体级别和分组变量上描述的任何列。

但是,我无法获得分组结果的输出。

我的数据:

df <- data.frame(gender=c("m", "f", "m","m"), age=c("18-22","23-32","23-32","50-60"), income=c("low", "low", "medium", "high"), group=c("A", "A", "B", "B"))
> df
  gender   age income group
1      m 18-22    low     A
2      f 23-32    low     A
3      m 23-32 medium     B
4      m 50-60   high     B

功能:

library(dplyr)
make_sum <- function(data=df, cols, group_var) {
data %>% dplyr::select(cols)  %>%
  # print tables with frequency and proportions
  apply(2, function(x) {
    n <-  table(x, useNA = "no")
    prop=round(n/length(x[!is.na(x)])*100,2)
    print(cbind(n, prop)) 
  })
  # print tables by group
data %>% dplyr::select(cols, vars(group_var))  %>%
  apply(2, function(x) {
    n <-  table(x, vars(group_var),useNA = "no")
   print(n)
  })  
}

cols <- df %>% dplyr::select(gender,age, income) %>% names()

make_sum(data=df, cols=cols, group_var="group")

我为整个表获得了正确的输出,但没有得到分组的输出,并显示以下错误:

Error: `vars(group_var)` must evaluate to column positions or names, not a list

分组性别变量的所需输出(示例):

    A B
  f 1 0
  m 1 2

1 个答案:

答案 0 :(得分:1)

此处可以调用['foo', :bar, 1].join('/') =>"foo/bar/1" 而不是将applyMARGIN = 2一起使用。而且,summarise_all包装的内容与tidyverse函数一起应用。在这里,为了获得频率,一个选择是用更直接的vars子集列。另外,由于[[仅返回一行(对于每个组-如果存在分组变量),我们可以将输出包装在summarise

list