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

R 在函数参数中选择列并按列分组,r,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

我试图编写一个函数,这样我就可以输入任何列,以便在总体级别和分组变量中进行描述

但是,我在获取分组结果的输出时遇到了问题

我的数据:

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
分组性别变量的期望输出(示例):

    A B
  f 1 0
  m 1 2

这里可以调用所有的
摘要,而不是使用
apply
MARGIN=2
。另外,
vars
wrapped与tidyverse函数一起应用。在这里,为了获得频率,一个选项是使用更直接的
[
对列进行子集设置。此外,由于
摘要
只返回一行(对于每个组-如果存在分组变量),我们可以将输出包装在
列表中

make_sum <- function(data=df, cols, group_var) {
data %>% 
  dplyr::select(cols)  %>%
   summarise_all(~ {

    n <-  table(.,  data[[group_var]], useNA = "no")
    #list(round(n/length(.[!is.na(.)])*100,2))
    list(n)

  })
  }


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

out <- make_sum(data=df, cols=cols, group_var="group")
out$gender
#[[1]]

#.   A B
#  f 1 0
#  m 1 2
make_sum%
dplyr::选择(列)%>%
总结所有内容(~{
n%
姓名()

在tidyverse函数中的
vars
包装工作中,您正在
base R
上调用它,这非常有效。我对函数进行了如下修改,以便在同一个表中打印比例(按列):make_sum%dplyr::select(cols)%%>%总结所有内容({n
    A B
  f 1 0
  m 1 2
make_sum <- function(data=df, cols, group_var) {
data %>% 
  dplyr::select(cols)  %>%
   summarise_all(~ {

    n <-  table(.,  data[[group_var]], useNA = "no")
    #list(round(n/length(.[!is.na(.)])*100,2))
    list(n)

  })
  }


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

out <- make_sum(data=df, cols=cols, group_var="group")
out$gender
#[[1]]

#.   A B
#  f 1 0
#  m 1 2