2015-04-16 75 views
1

我試圖根據同一個表中的單元格A的值更新表中的單元格B.要過濾我要更新的行,我正在使用grepl將單元格A與列表/表格/矢量或某些其他外部源的字符串列表進行比較。對於單元格A與搜索條件匹配的所有行,我想更新單元格B以表示「xxxx」。我需要爲我的表中的所有行執行此操作。基於來自另一個表的搜索字符串的R更新表列

到目前爲止,我有這樣的東西,其中cat1是某種有字符串搜索的列表。

for (x in 1:length(cat1)){ 
    data %<>% mutate(Cat = ifelse(grepl(cat1[i],ItemName),"xxx",Cat)) 
} 

我願意接受任何更好的方法來完成這一點。我已經嘗試了與數據框的循環,並且我開放給data.table解決方案。

謝謝。

回答

2

爲了避免循環,可以用|摺疊字符向量,然後使用它作爲在grepl單個圖案,例如可以嘗試:

cat1_collapsed <- paste(cat1, collapse = "|") 
data %>% mutate(Cat = ifelse(grepl(cat1_collapsed, ItemName),"xxx", Cat)) 

或同等使用data.table(當然或鹼R) 。

+0

謝謝!這很好。我現在唯一需要做的就是找到一種方法來做到這一點,但對於我已經崩潰的每一隻貓都有循環。所以例如cat1,cat2,cat3等......我想這將需要使用某種循環。另外,我需要對整個單詞進行grepl匹配。例如,如果我的搜索字詞是「狗」,我想匹配「胖狗」,但不是「狗狗」。 –

+0

@ user1991118,我不會更新我的答案,除非你提供一個最小的,獨立的可重現的例子。如果你這樣做,我可能會看到如何繼續。還要注意,你現在問的不是原來的問題。 –

+0

我明白了。我會盡量把可重現的東西放在一起併發布到一個新的問題上。再次感謝。 –

2

使用以下代碼假設你有稱爲「數據」與列「A」和「B」,並且將數據幀「CAT1」是所希望的字符串的載體,如所描述

library(data.table) 
setDT(data) 
data[A %in% cat1,B:="XXXX"] 
+0

這太棒了!非常感謝。我能夠設置它並且它很接近,但不是更新列,而是在數據的末尾添加帶有NA的新行,並將B更新爲「xxxx」以表示添加的NA行。我需要根據cat1向量中的值根據列A進行更新。我有SQL的經驗,我是R新手,但我看到它可能是多麼有用。再次感謝。 –

相關問題