R数据框操作:用apply处理列后通过filter筛选目标行
解决R语言数据处理问题的正确方法
你的代码问题点
- 管道(
%>%)里不能直接用df$Sample1 <-这种赋值写法,管道是把前一步结果传递给后一步,得用mutate来修改数据框列 filter里的逻辑判断要用&而非&&,&&只判断第一个元素,&才是对整个向量做逐行判断lapply处理列后返回的是列表,得转成数值型向量才能做%in%匹配
正确实现代码
假设你的df中Sample1、Sample2列是类似"100_xxx"、"200_yyy"的字符串,按以下步骤操作:
首先加载工具包(用tidyverse更便捷):
library(tidyverse)
定义待检查的数组:
toCheck <- c(100, 200)
用管道完成所有操作:
qq <- df %>% # 提取下划线前的数字并转成数值型 mutate( Sample1 = as.numeric(str_extract(Sample1, "^\\d+")), Sample2 = as.numeric(str_extract(Sample2, "^\\d+")) ) %>% # 筛选两列结果都在toCheck里的行 filter(Sample1 %in% toCheck & Sample2 %in% toCheck)
如果不想用stringr包,用base R的sub函数也能实现:
qq <- df %>% mutate( Sample1 = as.numeric(sub("_.*", "", Sample1)), Sample2 = as.numeric(sub("_.*", "", Sample2)) ) %>% filter(Sample1 %in% toCheck & Sample2 %in% toCheck)
关键代码解释
str_extract(Sample1, "^\\d+"):匹配字符串开头的所有连续数字(^表示字符串起始,\\d+代表一个或多个数字)sub("_.*", "", Sample1):把下划线及后面的所有内容替换为空,只留下前面的数字mutate:在管道流中直接修改数据框列,无需额外引用df$filter里的&:确保每一行的两列都满足匹配条件
内容的提问来源于stack exchange,提问作者Bugsy
相关产品推荐
相关产品推荐

