2016-11-26 65 views
-1

我有這樣一個使用R,如何過濾一列以保持項目包含在另一個?

columna <- c(1,2,3) 
columnb <- c("a b e", "c d", "a c d") 
columnc <- as.Date(c('2010-11-1','2008-3-25','2007-3-14')) 
alldata <- data.frame(columna,columnb,columnc) 
tokeep <- c("c", "e") 

一個數據幀,我希望得到同樣的alldatacolumnb修改爲只在columnb保持tokeep中發現的字符串。

理想的情況下,我想有alldata$columnb

[ "e", "c", "c" ] 

我第一次想到自己可以使用類似

filter(alldata, alldata$columnb %in% tokeep) 
alldata[which(alldata$b %in% tokeep), ] 

,但我不能設法找到一個解決方案。

有人可以指導我嗎?

+1

順便說一句,請參閱[如何SO接受答案(HTTP: //meta.stackexchange.com/questions/5234/how-does-accepting-an-answer-work)。如果一個答案適用於你,你應該接受它來獲得一些重要點並讓其他人知道問題已經解決。 –

回答

1

我們可以嘗試使用gsub代替我們不想用一個空字符串中的字符

alldata$columnb<- gsub(paste0("[^",paste0(tokeep,collapse = "|"),"]"),"", alldata$columnb) 

alldata 
# columna columnb columnc 
#1  1  e 2010-11-01 
#2  2  c 2008-03-25 
#3  3  c 2007-03-14 

我們正在創建的正則表達式是

paste0("[^",paste0(tokeep, collapse = "|"), "]") 

#[1] "[^c|e]" 

這意味着除了ce什麼。

編輯

按Wiktor的的評論,我們可能需要的正則表達式爲

paste0("[^",paste0(tokeep,collapse = ""),"]") 
#[1] "[^ce]" 
+1

我很抱歉,我現在不能投票。這是如此聰明的Ronak! –

+1

'[^ c | e]'表示不是'c','|'和'e',你絕對不需要'|'。另外,'[^ e]'是否定的*字符*類,它不適用於超過1個字符的字符串。 –

+0

我明白了。謝謝你Wiktor。按照OP所示的例子,我假定'columnb'中的值只有1個字符。 –

1

另一種選擇是str_extract

library(stringr) 
alldata$columnb <- str_extract(alldata$columnb, paste(tokeep, collapse="|")) 
alldata$columnb 
[#1] "e" "c" "c" 
相關問題