我正在使用一个有超过500 000个观测值的数据集。它可以在这里找到:http://archive.ics.uci.edu/ml/machine-learning-databases/00352/。我的目标是根据以下流行语删除部分行:
buzzwords = c("A", "B", "C", "D", "E", "F", "G", "H")
如果列描述包含这些流行语,例如" Apple"包含" A",我应该删除整行。我写了这个函数:
isUndesirable2 = function(x){
c=FALSE
for (i in 1:length(buzzwords)){
if (str_detect(toupper(x),buzzwords[i])){
c=TRUE
}
break
}
return(c)
}
上面的功能效果很好,我在多个例子上尝试过。但是,当我尝试对原始数据集进行子集化时:
dataset43 = dataset2[which(!isUndesirable2(as.character(dataset2$Description))),]
我收到了这个警告:
Warning message:
In if (str_detect(toupper(x), buzzwords[i])) { :
the condition has length > 1 and only the first element will be used
并且新数据集43为空。怪异!
如果对R有更多经验的人可以提供帮助 - 我真的很感激。谢谢! PS抱歉格式化,这是我的第一篇文章。
答案 0 :(得分:0)
考虑更像R的方法
buzzwords = c("A", "B", "C", "D", "E", "F", "G", "H")
dataset2 <- data.frame(Description=c("Apple", "Bee", "Zoo", "Green", "Hospital", "Yoohoo", "You"))
library(stringr)
我使用outer
对dataset2$Description
中的buzzwords
和str_detect(i, j)
进行全面比较。然后filter
数据集2基于是否找到任何流行语
is_buzzword_present <- outer(dataset2$Description, buzzwords, function(i, j) str_detect(toupper(i), j))
dplyr::filter(dataset2, !apply(is_buzzword_present, 1, any))
# Description
# 1 Zoo
# 2 You
答案 1 :(得分:0)
使用上面的例子,我们可以:
subset(dataset2,!grepl(paste(buzzwords,collapse="|"),do.call(paste,dataset2)))
Description
3 Zoo
6 Yoohoo
7 You