分组并汇总未知变量的列

时间:2020-04-30 07:59:00

标签: r group-by dplyr

这是我拥有的数据帧的示例:

Location <- c("a", "a", "a", "b", "b", "b", "b")
Code <- c("70", "70", "60", "60", "60", "60", "50")
df <- data.frame(Location, Code)

我想使用以下代码对代码进行分组和总结:

df2 <- df %>% 
  dplyr::group_by(df$Code) %>%
  dplyr::summarize(Number = n()) %>%
  dplyr::mutate(Percent = round((Number/sum(Number)*100))) %>%
  dplyr::arrange(desc(Number))

我希望在每个位置都可以。并增加一些困难;尚不清楚是否事先有不同的位置。我们的目标是拥有一个自动功能,通过仅使用不同的数据框(不清楚其中的位置)来为我提供每个位置的结果。

我正在寻找的结果是df2。 df2适用于所有位置。我想要一个数据框,其中列出了每个位置的代码并进行了汇总。因此位置“ a”将具有代码70(2次)和60(1次),位置“ b”具有60(3次)和50(1次)的代码。

我无法为此找到解决方案(仅当我逐步执行时才这样做)

谢谢。

3 个答案:

答案 0 :(得分:1)

我们可以为countLocation的每个Code个肠子,并使用Location计算每个group_by的比率。

library(dplyr)

df %>%
  count(Location, Code) %>%
  group_by(Location) %>%
  mutate(Percent = n/sum(n) * 100)

#  Location Code      n Percent
#  <chr>    <chr> <int>   <dbl>
#1 a        60        1    33.3
#2 a        70        2    66.7
#3 b        50        1    25  
#4 b        60        3    75  

如果我们希望将数据作为每个Location的单独列。

df %>% 
   count(Location, Code) %>% 
   tidyr::pivot_wider(names_from = Location, values_from = n, 
                       values_fill = list(n = 0))

在基数R中,您可以使用table

table(df$Code, df$Location)

答案 1 :(得分:1)

使用Ronak逻辑的Base R解决方案:

within(df, {
    n_vec <- as.numeric(ave(paste0(Location, Code), paste0(Location, Code), FUN = length))
    percent_vec <- ave(n_vec, Location, FUN = function(x){x / sum(n_vec)}) * 100
  }
)

答案 2 :(得分:1)

我们也可以将summarisegroup_by一起使用

library(dplyr)
df %>%
     group_by(Location, Code) %>%
     summarise(Percent = n()) %>% 
     mutate(Percent = Percent/sum(Percent) * 100)