仅在满足其他列中的条件时替换字符串

时间:2016-08-29 19:26:47

标签: r replace grep conditional-statements gsub

我有一个数据框

test<-data.frame(A=c("aa","be","cg","dh"),B=c("i","i","i","i"))

   A   B
1 aa  i
2 be  i
3 cg  i
4 dh  i

如果在i列中找到字符串B,我只想用yes替换B列中的e

所以最后看起来应该是这样的

  A   B
1 aa   i
2 be yes
3 cg   i
4 dh   i

我试过了

test[(grep("e", test$A)),] <- as.data.frame(lapply(test, gsub, pattern=      "i", replacement="yes", test$B))

虽然两个部分分开工作,但这个组合并没有给我想要的输出

3 个答案:

答案 0 :(得分:3)

ifelse功能派上用场:

test$B <- ifelse(grepl("e", test$A), gsub("i", "yes", test$B), test$B)

答案 1 :(得分:2)

有很多方法可以解决这个问题。在data.table中执行此操作的一种非常好的方法:

test<-data.frame(A=c("aa","be","cg","dh"),B=c("i","i","i","i"))
library(data.table)
test = as.data.table(test)
test[grepl("e",A),B := "yes"]

或在dplyr:

test<-data.frame(A=c("aa","be","cg","dh"),B=c("i","i","i","i"))
library(dplyr)
test = tbl_df(test)
test %>% mutate(B = ifelse(grepl("e",A),"yes",B))

答案 2 :(得分:1)

首先,确保你的字符串是字符串而不是因素:

test<-data.frame(A=c("aa","be","cg","dh"),B=c("i","i","i","i"),
    stringsAsFactors=F)

然后这将起作用:

test[grep("e", test$A),]$B =
    gsub(pattern= "i", replacement="yes", test[grep("e", test$A),]$B);

最好还是从data.frame切换到data.table,然后就是这样:

test[grepl("e", A), B := gsub("i", "yes", B)];

注意:这假设您要替换&#34; i&#34; B中有&#34;是&#34;,&#34; ii&#34;与&#34; yesyes&#34;,&#34; iai&#34;使用&#34; yesayes&#34;等...如果您只是想将B的值设置为&#34;是&#34;只要A有一个&#34; e&#34;,那么这个:

test[grepl("e", A), B := "yes"];

或者,如果您想将B的值设置为&#34;是&#34;每当B是&#34;我&#34;和A有一个&#34; e&#34;,然后这个:

test[B=="i" & grepl("e", A), B := "yes"];