根据字符串匹配删除数据 - R
Delete data based on string match - R
我正在使用 R 进行编程以处理 Csv 和数据操作如果与我的 csv 中的字符串匹配,我将尝试插入空值。
我的CSV如下:
first_name last _name zip_code
Ben Smith 12345
Blank Johnson 23456
Carrie No 34567
我想通过我的 csv 查看的 bad_names 列表是 bad_names <- c("blank", "no","bad", "old")
一旦我遍历 csv 寻找 bad_name 字符串匹配,我希望输出为
first_name last _name zip_code
Ben Smith 12345
Johnson 23456
Carrie 34567
因此它不会删除整行,而只会删除匹配的行。我正在努力删除条目,而不是整行,并遍历 bad_names.
的整个列表
感谢您提供的任何帮助!
正则表达式匹配的另一个选项:
使用此数据(您的示例在 last _name
header 中有错误):
data<-read.table(text="first_name last_name zip_code
Ben Smith 12345
Blank Johnson 23456
Carrie No 34567",header=TRUE)
注意:如果它是一个因素,我没有使用 stringAsFactors=FALSE 来展示我是如何管理它的,如果不是,请去掉 sapply 调用
bad_names <- c("blank", "no","bad", "old")
pat=paste0("(?i)\b",paste0(bad_names,collapse="\b|\b"),"\b")
t<-sapply(data,as.character)
gsub(pat,'',t)
我使用 sapply
从因子到字符的转换,快速而肮脏,因为它将所有转换为字符,有 better approach.
这里的技巧是使用 paste0 的正则表达式构造,我们创建 bad_words 的交替(由 |
分隔)并用 \b
包围它们以确保它是整个匹配的单词不只是任何单词的一部分。
然后我们全局替换 (gsub
) 任何匹配项。
给出:
first_name last_name zip_code
[1,] "Ben" "Smith" "12345"
[2,] "" "Johnson" "23456"
[3,] "Carrie" "" "34567"
这是因为整个 data.frame 是 class 字符,如果你想混合它们,你必须做一些不同的事情(不要再次复制这里的模式构造):
f<-sapply(data,is.character)
data[,f]<-lapply(data[,f],gsub,pattern=pat,replacement='')
想法是找到字符列并在它们的值上应用 gsub 以在匹配时用空替换。
我正在使用 R 进行编程以处理 Csv 和数据操作如果与我的 csv 中的字符串匹配,我将尝试插入空值。
我的CSV如下:
first_name last _name zip_code
Ben Smith 12345
Blank Johnson 23456
Carrie No 34567
我想通过我的 csv 查看的 bad_names 列表是 bad_names <- c("blank", "no","bad", "old")
一旦我遍历 csv 寻找 bad_name 字符串匹配,我希望输出为
first_name last _name zip_code
Ben Smith 12345
Johnson 23456
Carrie 34567
因此它不会删除整行,而只会删除匹配的行。我正在努力删除条目,而不是整行,并遍历 bad_names.
的整个列表感谢您提供的任何帮助!
正则表达式匹配的另一个选项:
使用此数据(您的示例在 last _name
header 中有错误):
data<-read.table(text="first_name last_name zip_code
Ben Smith 12345
Blank Johnson 23456
Carrie No 34567",header=TRUE)
注意:如果它是一个因素,我没有使用 stringAsFactors=FALSE 来展示我是如何管理它的,如果不是,请去掉 sapply 调用
bad_names <- c("blank", "no","bad", "old")
pat=paste0("(?i)\b",paste0(bad_names,collapse="\b|\b"),"\b")
t<-sapply(data,as.character)
gsub(pat,'',t)
我使用 sapply
从因子到字符的转换,快速而肮脏,因为它将所有转换为字符,有 better approach.
这里的技巧是使用 paste0 的正则表达式构造,我们创建 bad_words 的交替(由 |
分隔)并用 \b
包围它们以确保它是整个匹配的单词不只是任何单词的一部分。
然后我们全局替换 (gsub
) 任何匹配项。
给出:
first_name last_name zip_code
[1,] "Ben" "Smith" "12345"
[2,] "" "Johnson" "23456"
[3,] "Carrie" "" "34567"
这是因为整个 data.frame 是 class 字符,如果你想混合它们,你必须做一些不同的事情(不要再次复制这里的模式构造):
f<-sapply(data,is.character)
data[,f]<-lapply(data[,f],gsub,pattern=pat,replacement='')
想法是找到字符列并在它们的值上应用 gsub 以在匹配时用空替换。