根据类别合并(汇总)某些行

问题描述 投票:0回答:2

我正在 R 中使用一个简单的数据框,类似于这个:

data <- data.frame(
  "food"= c("Banana", "Orange", "Apple", "Meat", "Fish", "Cherries", "Wheat"),
  "kg"= c(2,3,1,2,6,4,5)
)

我的观点是,我想创建一个新行,名为“水果”,并将“香蕉”、“橙子”、“苹果”和“樱桃”的公斤值组合起来(然后我会删除这些并保留“水果”)。

这次尝试让我更接近解决方案:

library(tidyverse)
data <- data %>% 
  add_row(.data = data.frame(food="Fruits",
                             total=sum(data$kg[c=1,2,3,6])))

# Error message: 'incorrect number of dimensions'

我对 R 还很陌生,所以我不知道如何创建一个值来存储我想要的行的添加并将其包含在新行中。

r dataframe dplyr tibble summarize
2个回答
1
投票

假设我们有 2 个类别(水果和蛋白质),而“小麦”不属于这两个类别,因此不会被“总结”(如果您只想总结“水果”,只需删除

Protein 
来自
categories
列表)。

library(tibble)
library(tidyr)
library(dplyr)

categories <- list(Fruits = c("Banana", "Orange", "Apple", "Cherries"), 
                   Protein = c("Meat", "Fish"))

enframe(categories) %>% 
  unnest(value) %>% 
  full_join(data, .,  join_by(food == value)) %>% 
  mutate(name = coalesce(name, food)) %>% 
  summarise(food = first(name), kg = sum(kg, na.rm = T), .by = name) %>% 
  select(-name)

#>      food kg
#> 1  Fruits 10
#> 2 Protein  8
#> 3   Wheat  5

创建于 2024-03-12,使用 reprex v2.0.2


1
投票

您在寻找这样的东西吗?

library(tidyverse)

data <- data.frame(
  "food"= c("Banana", "Orange", "Apple", "Meat", "Fish", "Cherries", "Wheat"),
  "kg"= c(2,3,1,2,6,4,5)
)

data %>% 
   mutate(type = case_when(food %in% c("Banana", "Orange", "Apple", "Cherries") ~ "Fruits",
                           TRUE ~ "Other")) %>%
   group_by(type) %>%
   summarize(total_kg = sum(kg),
            .groups = "keep") %>%
   ungroup()

# A tibble: 2 × 2
#  type   total_kg
#  <chr>     <dbl>
#1 Fruits       10
#2 Other        13

在此创建一个名为

type
的附加变量,用于指定食物类型。您使用
type
变量对数据进行分组,然后可以按组对
kg
列求和。
summarize()
将数据集折叠为
type
变量中每个值的一行。

如果你想保留

food
变量,你可以使用这个
mutate()
代替
summarize()
。要仅按组保留总公斤数,请使用此处的第二个代码块(带有
distinct()
的代码块):

data %>% 
   mutate(type = case_when(food %in% c("Banana", "Orange", "Apple", "Cherries") ~ "Fruits",
                              TRUE ~ "Other")) %>%
   group_by(type) %>%
   mutate(total_kg = sum(kg)) %>%
   ungroup() 

# A tibble: 7 × 4
#  food        kg type   total_kg
#  <chr>    <dbl> <chr>     <dbl>
#1 Banana       2 Fruits       10
#2 Orange       3 Fruits       10
#3 Apple        1 Fruits       10
#4 Meat         2 Other        13
#5 Fish         6 Other        13
#6 Cherries     4 Fruits       10
#7 Wheat        5 Other        13

data1 %>%
   filter(type == "Fruits") %>%
   distinct(type, total_kg)  

# A tibble: 1 × 2
#  type   total_kg
#  <chr>     <dbl>
#1 Fruits       10 
© www.soinside.com 2019 - 2024. All rights reserved.