在R语言中如何删除多列包含指定MP4文件名的行?
你之前代码的错误原因
- 读文件时
na.strings参数使用错误:- 字符串值需要加英文双引号包裹,不加引号R会识别为变量名,才会报「对象未找到」的错误
- 要传入多个匹配值需要用
c()拼接成字符向量,不能用逻辑运算符&连接
- 第一次筛选逻辑错误:你筛选的是行名匹配目标文件名的行,而你的文件名存储在
filename_left、filename_right两列,和行名完全无关,自然删不掉目标行 - 第二次筛选逻辑错误:你写的
&是要求两列同时分别匹配两个目标文件才删除,只要任意一列不满足就会保留,漏掉了只有单列出现目标值的情况 - 第三次subset使用错误:
subset函数第二个参数是完整的筛选条件,你用逗号分隔了两个条件,函数只会生效第一个filename_left != xxx的判断,完全没用到filename_right的过滤规则
正确实现方法
首先定义你要过滤的目标文件名向量:
target_remove <- c("Playdoh_Butterfly_Natural.mp4", "Playdoh_Butterfly_Unnatural.mp4")
方法1:基础R实现
# 只要filename_left或filename_right任意一列出现目标值,就删除该行 import <- import[!(import$filename_left %in% target_remove | import$filename_right %in% target_remove), ]
或者用subset写法更简洁:
import <- subset(import, !(filename_left %in% target_remove | filename_right %in% target_remove))
方法2:dplyr包实现(更易读)
library(dplyr) import <- import %>% filter(!(filename_left %in% target_remove | filename_right %in% target_remove))
验证过滤结果
运行以下代码,如果输出全为FALSE说明所有目标行已经被删除:
any(import$filename_left %in% target_remove) any(import$filename_right %in% target_remove)
内容的提问来源于stack exchange,提问作者dampfy
相关产品推荐
相关产品推荐

