我有一个数据框
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))
虽然两个部分分开工作,但这个组合并没有给我想要的输出
答案 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"];