【问题标题】:group and summarize a column for unknown variables对未知变量的列进行分组和汇总
【发布时间】:2020-04-30 07:59:00
【问题描述】:

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

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 次)。

我找不到解决方案(只有我一步一步做,我不想要)

提前致谢。

【问题讨论】:

  • 不要在dplyr 代码中使用$。您正在寻找的预期输出是什么?你想像dplyr::group_by(Location, Code)一样在group_by中添加Location吗?
  • 感谢您的回复。我正在寻找的结果是 df2。 df2 虽然适用于所有位置。我想要一个数据框,其中代码按每个位置列出和汇总。因此位置“a”的代码为 70(2 次)和 60(1 次),位置“b”的代码为 60(3 次)和 50(1 次)。

标签: r group-by dplyr


【解决方案1】:

我们可以count 每个LocationCode 的输入数,并使用group_by 计算每个Location 的比率。

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)

【讨论】:

  • 这行得通,但在我的情况下这是不切实际的。我的原始数据框有数百万行和数十万不同的代码,这就是为什么我需要将位置作为列或两个不同的数据框,每个位置一个。
  • @Dutschke 您的输出的可视化表示会有所帮助。你需要df %&gt;% count(Location, Code) %&gt;% pivot_wider(names_from = Location, values_from = n, values_fill = list(n = 0)) 吗?
  • 很抱歉,我仍然需要了解 stackoverflow 的工作原理。我不知道如何呈现数据框。代码正是我需要的。非常感谢!
【解决方案2】:

使用 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
  }
)

【讨论】:

    【解决方案3】:

    我们也可以使用summarisegroup_by

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      • 1970-01-01
      • 2020-02-16
      相关资源
      最近更新 更多