2015-04-16 60 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新手,但我看到它可能是多么有用。再次感谢。 –

相关问题