如何合并iris的setosa与versicolor行,匹配到iris_3的seticolor行并求和列?
解决seticolor行连接后NA的问题
问题说明
我基于iris数据集创建了iris_3,其中seticolor行的Petal.Width是原iris中Setosa和versicolor的Petal.Width之和:
iris_3 <- read.table(header = TRUE, text = " species_id Species Petal.Width 1 1 virginica 2.5 2 1 seticolor 1.6 3 2 virginica 1.9 4 2 seticolor 1.7 5 3 virginica 2.1 6 3 seticolor 1.7 ")
尝试左连接原iris(排除Petal.Length)时,seticolor行的Sepal.Length和Sepal.Width全为NA:
iris_merged <- iris_3 %>% left_join(select(iris,-(Petal.Length | Petal.Width)), by =c("Species","species_id"))
合并结果:
species_id Species Petal.Width Sepal.Length Sepal.Width <int> <chr> <dbl> <dbl> <dbl> 1 1 virginica 2.5 6.3 3.3 2 1 seticolor 1.6 NA NA 3 2 virginica 1.9 5.8 2.7 4 2 seticolor 1.7 NA NA 5 3 virginica 2.1 7.1 3 6 3 seticolor 1.7 NA NA
需求:让seticolor行的Sepal.Length和Sepal.Width取原iris中Setosa和versicolor对应列的求和值,完成匹配。
解决方案
核心问题分析
原iris没有species_id列,且不存在seticolor这个物种,导致连接时无法匹配,出现NA。需要先预处理原iris,生成对应seticolor的汇总行,并补充species_id。
代码实现
library(dplyr) # 1. 预处理原iris:生成virginica行和seticolor汇总行,补充species_id iris_processed <- iris %>% select(-Petal.Length) %>% # 处理virginica行:给每个virginica样本分配对应的species_id(示例为1-3循环,可根据实际调整) filter(Species == "virginica") %>% mutate(species_id = row_number() %% 3 + 1) %>% # 添加seticolor汇总行:每个species_id对应Setosa+versicolor的求和值 bind_rows( tibble( species_id = 1:3, Species = "seticolor", Sepal.Length = sum(iris$Sepal.Length[iris$Species %in% c("setosa", "versicolor")]), Sepal.Width = sum(iris$Sepal.Width[iris$Species %in% c("setosa", "versicolor")]) ) ) # 2. 执行左连接 iris_merged_final <- iris_3 %>% left_join(iris_processed, by = c("species_id", "Species"))
结果说明
执行后,seticolor行的Sepal.Length和Sepal.Width会填充原iris中Setosa和versicolor的求和值,virginica行也能正确匹配对应列的数据。
如果你的species_id对应特定的样本分组,只需调整iris_processed中species_id的分配规则即可。
内容的提问来源于stack exchange,提问作者boris_the_unicorn
相关产品推荐
相关产品推荐

