如何一次一个地从列名列表中聚合多个列?

时间:2018-04-03 10:57:58

标签: r aggregate

我有一个数据框

x   <-
id1 id2  id3   id4
1   a    12x   1001    
2   a    23x   2001    
3   a    98y   3001    
2   a    98y   1001    
2   b    12x   2001    
1   b    23x   3001    
2   b    12x   1001    
3   b    98y   2001  

我正在尝试编写一个函数,它将所有列名作为参数,按每个列的count聚合,并返回不同的数据帧(在这种情况下为4),其中汇总了一列。

3 个答案:

答案 0 :(得分:1)

我使用:

重新创建了对象x
text = "id1 id2  id3   id4
    1   a    12x   1001    
    2   a    23x   2001    
    3   a    98y   3001    
    2   a    98y   1001    
    2   b    12x   2001    
    1   b    23x   3001    
    2   b    12x   1001    
    3   b    98y   2001"

x <- read.table(text = text, header = TRUE)

然后,您可以使用lapply()浏览ID列表并应用匿名函数,该函数采用id和数据框,按id中指定的字符对其进行分组,每个df组总结(即计算观察次数)id

library(dplyr)

lapply(list("id1", "id2", "id3", "id4"), function(id, df) {
  df %>% 
    group_by_at(.vars = id) %>% 
    summarise(n = n())
}, df = x)

它返回4个tibble的列表(data.frame s的扩展名):

[[1]]
# A tibble: 3 x 2
    id1     n
  <int> <int>
1     1     2
2     2     4
3     3     2

[[2]]
# A tibble: 2 x 2
  id2       n
  <fct> <int>
1 a         4
2 b         4

[[3]]
# A tibble: 3 x 2
  id3       n
  <fct> <int>
1 12x       3
2 23x       2
3 98y       3

[[4]]
# A tibble: 3 x 2
    id4     n
  <int> <int>
1  1001     3
2  2001     3
3  3001     2

答案 1 :(得分:1)

我们可以将mapdplyr count

一起使用
library(tidyverse)
names(df) %>%
    map(~ df %>%
             count(!! rlang::sym(.x))
      )

-output

#[[1]]
# A tibble: 3 x 2
#    id1     n
#  <int> <int>
#1     1     2
#2     2     4
#3     3     2

#[[2]]
# A tibble: 2 x 2
#  id2       n
#  <chr> <int>
#1 a         4
#2 b         4

#[[3]]
# A tibble: 3 x 2
#  id3       n
#  <chr> <int>
#1 12x       3
#2 23x       2
#3 98y       3

#[[4]]
# A tibble: 3 x 2
#    id4     n
#  <int> <int>
#1  1001     3
#2  2001     3
#3  3001     2

答案 2 :(得分:1)

以下是使用tidyr的{​​{1}} / dplyr解决方案:

count

说明:将library(tidyverse); lst <- x %>% gather(k, v) %>% group_by(k, v) %>% count() %>% split(.$k) #$id1 ## A tibble: 3 x 3 ## Groups: k, v [3] # k v n # <chr> <chr> <int> #1 id1 1 2 #2 id1 2 4 #3 id1 3 2 # #$id2 ## A tibble: 2 x 3 ## Groups: k, v [2] # k v n # <chr> <chr> <int> #1 id2 a 4 #2 id2 b 4 # #$id3 ## A tibble: 3 x 3 ## Groups: k, v [3] # k v n # <chr> <chr> <int> #1 id3 12x 3 #2 id3 23x 2 #3 id3 98y 3 # #$id4 ## A tibble: 3 x 3 ## Groups: k, v [3] # k v n # <chr> <chr> <int> #1 id4 1001 3 #2 id4 2001 3 #3 id4 3001 2 从宽格式转换为长格式,data.frame按键(列名称)和值(条目),并将条目拆分为count list按键(列名)。