我想查看有多少电子邮件地址包含电子邮件所有者的姓氏。
数据框中的每一行都包含姓氏和电子邮件地址。我想添加第三列,其中包含“是”或“否”,表示该行电子邮件中存在姓氏。
使用for循环工作正常...但我不禁想到可能有更好的R解决方案。有关如何使这更优雅的任何建议?
vec1 <- c("foo", "smith")
vec2 <- c("[email protected]", "[email protected]")
df <- data.frame(vec1,vec2)
for(i in 1:nrow(df)) {
if (grepl(df$vec1[i], df$vec2[i]) == TRUE) {
df$lastNameInEmail[i] <- "Yes"
} else {
df$lastNameInEmail[i] <- "No"
}
}
vec1 vec2 lastNameInEmail
1 foo [email protected] Yes
2 smith [email protected] No
你可以使用stringr
str_detect
stringr::str_detect(vec2,paste(vec1,collapse = '|'))
[1] TRUE FALSE
这是一个使用基本R函数的版本,它适用于两个以上的给定行:
vec1 <- c("foo", "smith", "jones", "bar")
vec2 <- c("[email protected]", "[email protected]", "[email protected]", "[email protected]")
df <- data.frame(vec1,vec2)
df$lastNameInEmail <- sapply(1:nrow(df), function(x){ifelse(grepl(df$vec1[x], df$vec2[x])==TRUE, "Yes", "No")})
df
vec1 vec2 lastNameInEmail
1: foo [email protected] Yes
2: smith [email protected] No
3: jones [email protected] No
4: bar [email protected] Yes
这是一个data.table替代方案,适用于两个以上给定的行:
vec1 <- c("foo", "smith", "jones", "bar")
vec2 <- c("[email protected]", "[email protected]", "[email protected]", "[email protected]")
df <- data.frame(vec1,vec2)
library(data.table)
dt <- data.table(df)
dt[, lastNameInEmail:=ifelse(grepl(vec1, vec2) == TRUE, "Yes", "No"), by=vec1]
dt
vec1 vec2 lastNameInEmail
1: foo [email protected] Yes
2: smith [email protected] No
3: jones [email protected] No
4: bar [email protected] Yes
这假设vec1列是唯一的。