如何在R语言中按plot分组,基于species条件对value列求和生成新数据框?
按地块计算阔叶树与针叶树的Value总和
方法一:直接分组条件求和(最简洁)
利用dplyr的分组和条件索引直接计算总和:
library(dplyr) df1 <- df %>% group_by(plot) %>% summarize( # 计算阔叶树(Fagus、Quercus)的value总和 share.broadleaves = sum(value[species %in% c("Fagus", "Quercus")]), # 计算针叶树(Abies、Picea)的value总和 share.conifers = sum(value[species %in% c("Abies", "Picea")]) ) # 查看结果 print(df1)
方法二:结合case_when分类后聚合(贴合你的思路)
先通过case_when标记树种类型,再分组求和并转换格式:
library(dplyr) library(tidyr) # 需要用到pivot_wider df1 <- df %>% # 标记每个树种的类型 mutate( tree_type = case_when( species %in% c("Fagus", "Quercus") ~ "broadleaves", species %in% c("Abies", "Picea") ~ "conifers", TRUE ~ NA_character_ # 处理未定义的树种 ) ) %>% # 按地块和树种类型分组求和 group_by(plot, tree_type) %>% summarize(total_value = sum(value)) %>% # 将行转换为列,得到目标结构 pivot_wider(names_from = tree_type, values_from = total_value, names_prefix = "share.") print(df1)
原代码的问题说明
- 管道操作中必须使用
dplyr的动词(如summarize/mutate),不能直接赋值新列 - 逻辑判断要用
==(等于)、|(或),而非=、or case_when是用来生成分类列的工具,不能直接指定FUN="sum",聚合操作需要配合summarize完成
内容的提问来源于stack exchange,提问作者starski
相关产品推荐
相关产品推荐

