You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何合并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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 02:17:13