2015-10-20 67 views
2

我有一個數據幀rawdata,其中包含包含生態信息的列。我試圖消除列LatinName與我已經擁有一些數據的物種的向量匹配的所有行,並僅創建一個僅包含缺少數據的物種的新數據幀。所以,我想要做的是這樣的:消除與字符串匹配的數據幀行

matches <- c("Thunnus thynnus", "Balaenoptera musculus", "Homarus americanus") 
# obviously these are a random subset; the real vector has ~16,000 values 
rawdata_missing <- rawdata %>% filter(LatinName != "matches") 

這是行不通的,因爲布爾運算符不能應用於字符串。我也可以做這樣的事情:

rawdata_missing <- filter(rawdata, !grepl(matches, LatinName) 

這不起作用,或者是因爲!grepl也不能使用的字符串。

我知道有很多的方法,我可以用其中LatinName IS在matches行子集rawdata,但我不能想出一個巧妙的方法進行子集rawdata這樣LatinName沒有在matches

在此先感謝您的幫助!

+1

就否定了'%在%'運營商 - !'RAWDATA%>%濾波器((LatinName %in%matches))' – thelatemail

+0

@ thelatemail的方法是這裏的方法。但是爲了將來的參考,如果你確實需要將一個字符串向量轉換爲一個正則表達式,你可以使用'grepl'或'grep'來使用,例如'match.string = paste(matches,collapse =「|」) )'。 – eipi10

+0

@thelatemail是完美的!謝謝。我只是不知道如何編寫否定操作。 – AFH

回答

2
filteredData <- rawdata[!(rawdata$LatinName %in% Matches), ] 
+0

謝謝!這與如上所示否定%中的%一樣起作用:) – AFH

0

的另一種方法,通過使用子集,粘貼,mapply和grepl是...

fileteredData <- subset(rawdata,mapply(grepl,rawdata$LatinName,paste(Matches,collapse = "|")) == FALSE)