在R语言中如何筛选两列共有的物种并生成对应协作状态的新数据集
解决物种数据集的匹配与重组问题
我来帮你搞定这个数据集的处理需求,咱们一步一步来实现你想要的结果:
首先加载你的数据集
先把你提供的数据结构转换成可直接使用的R数据框:
data <- structure(list(species.2017 = c("Abrocoma cinerea", "Acomys cineraceus", "Acomys kempi", "Acomys louisae", "Acomys minous", "Acomys percivali", "Acomys russatus", "Acomys spinosissimus", "Acomys subspinosus", "Acomys wilsoni", "Aconaemys fuscus", "Acrobates pygmaeus", "Addax nasomaculatus", "Aepyceros melampus", "Aethomys chrysophilus", "Aethomys hindei", "Aethomys kaiseri", "Ailuropoda melanoleuca", "Ailurus fulgens", "Akodon azarae"), cooperative.2017 = c("no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no"), species.2012 = c("Abrocoma cinerea", "Acinonyx jubatus", "Acomys cahirinus", "Acomys cilicicus", "Acomys ignitus", "Acomys kempi", "Acomys louisae", "Acomys minous", "Acomys mullah", "Acomys nesiotes", "Acomys percivali", "Acomys russatus", "Acomys spinosissimus", "Acomys subspinosus", "Acomys wilsoni", "Aconaemys fuscus", "Acrobates pygmaeus", "Addax nasomaculatus", "Aepyceros melampus", "Aethomys chrysophilus" ), cooperative.2012 = c("no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no", "no")), row.names = c(NA, 20L), class = "data.frame")
方法一:使用Base R实现
这种方法适合习惯原生R语法的用户:
- 筛选出两年都存在的物种
common_species <- intersect(data$species.2017, data$species.2012)
- 分别整理2012和2017年的子集并重命名列
# 处理2012年数据 df_2012 <- data[data$species.2012 %in% common_species, c("species.2012", "cooperative.2012")] colnames(df_2012) <- c("species name", "cooperative.2012") # 处理2017年数据 df_2017 <- data[data$species.2017 %in% common_species, c("species.2017", "cooperative.2017")] colnames(df_2017) <- c("species name", "cooperative.2017")
- 合并两个子集得到最终结果
end.result <- merge(df_2012, df_2017, by = "species name", all = FALSE) # 查看结果 end.result
方法二:使用Tidyverse工具链实现
如果你熟悉dplyr和tidyr,这种方法更简洁直观:
- 先加载所需包
library(dplyr) library(tidyr)
- 一步完成数据转换与筛选
end.result_tidy <- data %>% # 将宽格式数据转为长格式,拆分年份和变量类型 pivot_longer( cols = everything(), names_to = c(".value", "year"), names_sep = "\\." ) %>% # 按物种分组,仅保留同时存在两年记录的物种 group_by(species) %>% filter(n_distinct(year) == 2) %>% # 转回宽格式,生成目标列名 pivot_wider( names_from = year, values_from = cooperative, names_prefix = "cooperative." ) %>% ungroup() %>% # 重命名物种列以匹配你的需求 rename("species name" = species) # 查看结果 end.result_tidy
两种方法最终都会得到你想要的3列数据集:species name、cooperative.2012和cooperative.2017,且仅包含同时出现在两年物种列表中的物种及其对应数据。
内容的提问来源于stack exchange,提问作者YBM
相关产品推荐
相关产品推荐

