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

如何在R语言中依据另一个DataFrame的值筛选保留DataFrame行

解决DataFrame筛选问题:匹配动物并保留指定研究日内的记录

嘿,我来帮你搞定这个需求!你需要从dt中筛选出满足两个条件的行:refanimal匹配dt2里的animal,且studyday不超过对应动物的lastday。下面给你两种常用的实现方法,都是R里的常规操作:

第一步:先构造示例数据(方便你测试)

首先把你提供的DataFrame用代码还原出来,这样你可以直接运行测试:

# 构造dt数据框
dt <- data.frame(
  companimal = rep("b10", 20),
  refanimal = rep(c("b1", "b2", "b3", "b4"), each = 5),
  X = c(2,9,4,4,11,1,1,20,12,16,9,2,17,22,1,13,17,9,7,19),
  studyday = rep(1:5, 4)
)

# 构造dt2数据框
dt2 <- data.frame(
  animal = c("b1", "b2", "b3", "b4"),
  lastday = c(5,3,4,3)
)

方法一:基础R原生操作

这种方法不需要额外安装包,用merge合并两个数据框,再筛选符合条件的行:

# 1. 按refanimal和animal合并两个数据框
merged_data <- merge(dt, dt2, by.x = "refanimal", by.y = "animal")

# 2. 筛选studyday <= lastday的行
filtered_data <- merged_data[merged_data$studyday <= merged_data$lastday, ]

# 3. (可选)如果不需要lastday列,可以移除它
filtered_data <- filtered_data[, names(dt)]

方法二:用dplyr(tidyverse)实现(更直观)

如果你习惯用tidyverse风格的代码,这种管道写法可读性更强,适合后续扩展复杂操作:

# 先加载dplyr包(如果没安装先运行install.packages("dplyr"))
library(dplyr)

filtered_data <- dt %>%
  # 按refanimal匹配dt2的animal
  left_join(dt2, by = c("refanimal" = "animal")) %>%
  # 筛选符合studyday条件的行
  filter(studyday <= lastday) %>%
  # 移除不需要的lastday列
  select(-lastday)

验证结果

两种方法得到的结果是一致的:

  • 比如b2的lastday是3,所以只会保留它studyday为1、2、3的行;
  • b4的lastday是3,所以保留它studyday1-3的行;
  • b1的lastday是5,所以所有行都保留;
  • b3的lastday是4,保留studyday1-4的行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 06:15:13