r - 基于另一列的 block 因子

标签 r tidyverse forcats

该示例显示了不同工厂的产量测量值, 第一列表示工厂 最后一列是生产量。

factory <- c("A","A","B","B","B","B","B","C","D")
production <- c(15, 2, 1, 1, 2, 1, 2,20,5)
df <- data.frame(factory, production)
df
  factory production
1       A         15
2       A          2
3       B          1
4       B          1
5       B          2
6       B          1
7       B          2
8       C         20
9       D          5

现在我想根据工厂在这个数据集中的总产量将这些工厂集中到更少的级别。

使用正常的 forcats::fct_lump,我可以根据它们出现的行数来合并它们,例如制作 3 个级别:

library(tidyverse)    
df %>% mutate(factory=fct_lump(factory,2))
      factory production
    1       A         15
    2       A          2
    3       B          1
    4       B          1
    5       B          2
    6       B          1
    7       B          2
    8   Other         20
    9   Other          5

但我想根据总和(产量)对它们进行汇总,保留前 n=2 家工厂(按总产量)并将其余工厂汇总。期望的结果:

1       A         15
2       A          2
3   Other          1
4   Other          1
5   Other          2
6   Other          1
7   Other          2
8       C         20
9   Other          5

有什么建议吗?

谢谢!

最佳答案

这里的关键是应用特定的理念,以便根据生产总和将工厂分组在一起。请注意,这种理念与您在(真实)数据集中的实际值有关。

选项 1

下面的示例将总产量等于或小于 15 的工厂组合在一起。如果你想要另一个分组,你可以修改阈值(例如使用 18 而不是 15)

factory <- c("A","A","B","B","B","B","B","C","D")
production <- c(15, 2, 1, 1, 2, 1, 2,20,5)
df <- data.frame(factory, production, stringsAsFactors = F)

library(dplyr)

df %>%
  group_by(factory) %>%
  mutate(factory_new = ifelse(sum(production) > 15, factory, "Other")) %>%
  ungroup()

# # A tibble: 9 x 3
#   factory production factory_new
#   <chr>        <dbl> <chr>      
# 1 A               15 A          
# 2 A                2 A          
# 3 B                1 Other      
# 4 B                1 Other      
# 5 B                2 Other      
# 6 B                1 Other      
# 7 B                2 Other      
# 8 C               20 C          
# 9 D                5 Other 

我正在创建 factory_new 而不删除(原始的)factory 列。

选项 2

这是一个示例,您可以根据工厂的产量对工厂进行排名/排序,然后您可以选择一些顶级工厂保持原样并将其余工厂分组

factory <- c("A","A","B","B","B","B","B","C","D")
production <- c(15, 2, 1, 1, 2, 1, 2,20,5)
df <- data.frame(factory, production, stringsAsFactors = F)

library(dplyr)

# get ranked factories based on sum production
df %>%
  group_by(factory) %>%
  summarise(SumProd = sum(production)) %>%
  arrange(desc(SumProd)) %>%
  pull(factory) -> vec_top_factories

# input how many top factories you want to keep
# rest will be grouped together
n = 2

# apply the grouping based on n provided
df %>%
  group_by(factory) %>%
  mutate(factory_new = ifelse(factory %in% vec_top_factories[1:n], factory, "Other")) %>%
  ungroup()

# # A tibble: 9 x 3
#   factory production factory_new
#   <chr>        <dbl> <chr>      
# 1 A               15 A          
# 2 A                2 A          
# 3 B                1 Other      
# 4 B                1 Other      
# 5 B                2 Other      
# 6 B                1 Other      
# 7 B                2 Other      
# 8 C               20 C          
# 9 D                5 Other 

关于r - 基于另一列的 block 因子,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52649755/

相关文章:

r - 如何使循环函数将其结果输出为R中的数据帧

r - R中的pivot_wider删除我需要的变量

r - 如何将弹出式帮助文本添加到 RStudio 中用户创建的包中的函数?

r - 如何在来自两个数据帧的分组值之间执行操作

使用 R 中的 fct_reorder 根据值重新排序因子

r - 使用 dplyr 将函数应用于 data.frame 中的一行

r - 通过循环 rvest::follow_link() 函数来抓取链接的 HTML 网页

r - 如何在 R 中使用 ifelse 条件从向量中删除

r - 重命名data.frame中的整数