如何根据特定条件对数据集进行子集化?

时间:2018-02-05 20:46:08

标签: r subset

我正在使用一个有超过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抱歉格式化,这是我的第一篇文章。

2 个答案:

答案 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)

我使用outerdataset2$Description中的buzzwordsstr_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