如何用tidy方法筛选同时含urea和creat测试记录的R数据框行?
筛选同时包含两种测试记录的数据行(tidy风格解法)
原始数据
我们有记录化学反应测量数据的R数据框,包含name、test、value三列:
df <- data.frame(name=c("A","A","B","C","C","D"), test=c("urea","creat","urea","urea","creat","creat"), value=c(30,1,40,50,2,0.6))
数据预览:
name test value 1 A urea 30.0 2 A creat 1.0 3 B urea 40.0 4 C urea 50.0 5 C creat 2.0 6 D creat 0.6
需求
筛选出同时拥有urea和creat两类测试记录的name对应的所有行,期望结果:
name test value 1 A urea 30.0 2 A creat 1.0 3 C urea 50.0 4 C creat 2.0
尝试的错误方案
以下循环写法未能实现需求:
ndf <- data.frame() n<-6 while(n>0){ ifelse(df[n,2]=="creat" && df[n-1,2]=="urea", n<-n-2, ndf <- add_row(ndf, df[(n-1):n,2]), n<-n-1) }
tidy风格的正确解法
使用dplyr包的分组筛选逻辑即可实现,无需rowwise:
library(dplyr) result <- df %>% group_by(name) %>% filter(all(c("urea", "creat") %in% test)) %>% ungroup() # 查看结果 result
代码逻辑说明
group_by(name):将数据按name分组,把同一名称的所有测试记录归为一组filter(all(c("urea", "creat") %in% test)):检查每组的test列是否同时包含"urea"和"creat"两个值,仅保留满足该条件的分组ungroup():取消分组结构,返回标准数据框格式
运行后即可得到符合需求的结果。
内容的提问来源于stack exchange,提问作者Adonis Cedeño
相关产品推荐
相关产品推荐

