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思路方向是对的,但后续筛选逻辑有两处关键问题:
- 使用
lapply会返回列表格式的结果,而which需要的是逻辑向量,应该改用sapply来返回向量格式的判断结果; - 仅通过
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
相关产品推荐
相关产品推荐

