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

R语言筛选data.frame中父亲相同但母亲不同的记录

解决R语言筛选父亲有多个伴侣的孩子记录问题

首先,先明确你的需求:从亲属信息数据框中,找出所有父亲相同但母亲不同的孩子记录,也就是筛选出那些父亲有多个伴侣对应的孩子。

先构造示例数据

我们先把你提供的数据转换成R可直接使用的数据框:

kinship <- data.frame(
  name = c("john", "quincy", "anna", "daniel", "sandra"),
  dad = c("bert", "adam", "david", "bert", "adam"),
  mom = c("ernie", "eve", "goliath", "ernie", "linda"),
  stringsAsFactors = FALSE  # 避免因子类型带来的额外问题
)

你原有代码的问题

你的split思路方向是对的,但后续筛选逻辑有两处关键问题:

  1. 使用lapply会返回列表格式的结果,而which需要的是逻辑向量,应该改用sapply来返回向量格式的判断结果;
  2. 仅通过nrow(x) == 1判断是不准确的——比如bert有两个孩子,但母亲都是ernie,这组应该被排除,所以真正的判断条件应该是组内母亲的唯一值数量大于1,而不是组的行数。

方法1:Base R 规范实现

按照你的拆分思路修正后,代码如下:

# 按父亲列拆分数据框
fraternals <- split(kinship, kinship$dad)

# 筛选出组内母亲唯一值数量>1的子数据框
fraternals <- fraternals[sapply(fraternals, function(x) length(unique(x$mom)) > 1)]

# 将筛选后的子数据框合并为最终结果
result <- do.call(rbind, fraternals)

# 查看结果
print(result)

运行后输出:

name  dad   mom
adam quincy adam  eve
adam sandra adam linda

方法2:Tidyverse(dplyr)更简洁的规范实现

在R中,使用dplyr的分组筛选是更易读、更符合现代R数据分析规范的方法:

library(dplyr)

result <- kinship %>%
  group_by(dad) %>%          # 按父亲分组
  filter(n_distinct(mom) > 1) %>%  # 筛选组内母亲不同值数量>1的行
  ungroup()                  # 取消分组

# 查看结果
print(result)

运行后输出:

# A tibble: 2 × 3
  name   dad   mom  
  <chr>  <chr> <chr>
1 quincy adam  eve  
2 sandra adam  linda

这两种方法都能准确得到你想要的结果,其中dplyr的写法更简洁直观,也是当前R数据分析的主流规范写法。

内容的提问来源于stack exchange,提问作者JadaLovelace

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.14 08:13:03