在多个列上循环group_by函数

时间:2018-07-16 20:29:52

标签: r dplyr data.table

所以我试图用我的数据表中的不同记录创建一个表

mytable <-
   group team num  ID
 1   a   x    1    9
 2   a   x    2    4
 3   a   y    3    5
 4   a   y    4    9
 5   b   x    1    7
 6   b   y    4    4
 7   b   x    3    9
 8   b   y    2    8

列名称为组,团队,编号和ID。我想要一个单独的表,其中包含每个列中不同记录的计数。我希望表名的格式为“ table_colName”

colName <- c('group','team','num','ID')

for (col in colName)
     'table_'+colName <- mytable %>% group_by(col) %>% summarise(Count = n())

这将生成错误“ grouped_df_impl(数据,未命名(vars),删除)中的错误:列col不明”。

有没有一种方法可以使用数据表中的列遍历group_by函数并将其每次保存到新数据表中,因此在此示例中,我最终得到table_group,table_team,table_num和table_ID?

4 个答案:

答案 0 :(得分:1)

一种选择是将group_by_atlapply结合使用。您需要将mytable的列传递给lapply。该函数将每列分组,结果将在列表中提供。

library(dplyr)

lapply(names(mytable), function(x){
  group_by_at(mytable, x)%>%summarise(Count = n()) %>% as.data.frame()
})


# [[1]]
#   group Count
# 1     a     4
# 2     b     4
# 
# [[2]]
#   team Count
# 1    x     4
# 2    y     4
# 
# [[3]]
#   num Count
# 1   1     2
# 2   2     2
# 3   3     2
# 4   4     2
# 
# [[4]]
#   ID Count
# 1  4     2
# 2  5     1
# 3  7     1
# 4  8     1
# 5  9     3

数据:

mytable <- read.table(text=
"group team num  ID
1   a   x    1    9
2   a   x    2    4
3   a   y    3    5
4   a   y    4    9
5   b   x    1    7
6   b   y    4    4
7   b   x    3    9
8   b   y    2    8",
header = TRUE, stringsAsFactors = FALSE)

答案 1 :(得分:0)

尝试一下:

mytable %>% 
  group_by(.dots=c('group','team','num','ID')) %>% 
  summarise(Count = n())

答案 2 :(得分:0)

我能够使用下面的代码解决此问题,谢谢大家为我提供帮助的尝试,但是我是编码新手,对不起,这个问题对不起!

 colName <- c('group','team','num','ID')

 for (col in colName) {
     tables <- paste('table',col, sep = '_')
     assign(tables, mytable %>% group_by(.dots = col) %>% summarise(Count = n()))
     }

答案 3 :(得分:0)

使用data.tablelapply的解决方案。

创建数据

library(data.table)

dt <- read.table(text = "
group team num  ID
1   a   x    1    9
2   a   x    2    4
3   a   y    3    5
4   a   y    4    9
5   b   x    1    7
6   b   y    4    4
7   b   x    3    9
8   b   y    2    8")

生成结果的代码

setDT(dt)

l <- lapply(cnms, function(i)setnames(dt[, .N, get(i)], "get", i))
names(l) <- paste0("table_", cnms)
str(l)