我正在 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 还很陌生,所以我不知道如何创建一个值来存储我想要的行的添加并将其包含在新行中。
假设我们有 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
您在寻找这样的东西吗?
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