Regex 基于字符串模式和ifelse的存在创建列
如果模式匹配,我想用两个值中的一个填充一个新列 这是我的数据框:Regex 基于字符串模式和ifelse的存在创建列,regex,r,if-statement,Regex,R,If Statement,如果模式匹配,我想用两个值中的一个填充一个新列 这是我的数据框: df <- structure(list(loc_01 = c("apis", "indu", "isro", "miss", "non_apis", "non_indu", "non_isro", "non_miss", "non_piro",
df <- structure(list(loc_01 = c("apis", "indu", "isro", "miss", "non_apis",
"non_indu", "non_isro", "non_miss", "non_piro", "non_sacn", "non_slbe",
"non_voya", "piro", "sacn", "slbe", "voya"), loc01_land = c(165730500,
62101800, 540687600, 161140500, 1694590200, 1459707300, 1025051400,
1419866100, 2037064500, 2204629200, 1918840500, 886299300, 264726000,
321003900, 241292700, 530532000)), class = "data.frame", row.names = c(NA,
-16L), .Names = c("loc_01", "loc01_land"))
我想在df
中添加一列,名为“loc_01”。如果loc_01包含non,则返回“外部”,如果不包含non,则返回“内部”。这是我的ifelse语句,但我遗漏了一些内容,因为它只返回false
值
df$loc01 <- ifelse(df$loc_01 == "non", 'outside', 'inside')
谢谢
-al要检查字符串是否包含某个子字符串,不能使用
=
,因为它执行精确匹配(即,仅当字符串完全为“非”时才返回true)。例如,您可以使用执行模式匹配的
grepl
函数(属于):
您只需要一行代码:
要使用更复杂的正则表达式模式,可以使用str\u detect
代替str\u start
:
df %>%
mutate(loc01 = if_else(str_detect(loc_01, "^(non_)"), "outside", "inside"))
输出:
loc_01 loc01_land loc01
<chr> <dbl> <chr>
1 apis 165730500 inside
2 indu 62101800 inside
3 isro 540687600 inside
4 miss 161140500 inside
5 non_apis 1694590200 outside
6 non_indu 1459707300 outside
7 non_isro 1025051400 outside
8 non_miss 1419866100 outside
9 non_piro 2037064500 outside
loc\U 01 loc01\U land loc01
1室内空气污染指数165730500
2印度河62101800内部
3 isro 540687600内部
4.室内161140500小姐
5非欧盟API 1694590200外部
6非印度河1459707300号外部
7非印度空间研究组织1025051400外部
8非欧小姐1419866100室外
9非皮罗2037064500室外
@digEmAll如何将此解决方案扩展到要匹配的值列表?如果我想匹配“du”或“bis”或“lb”,而不是“non”,那么如果df$loc01包含这些值中的任何一个,那么loc01列将是“in”,如果3个值都不匹配,那么loc01列将是“out”?@user3614783:您可以使用更复杂的正则表达式,例如:grepl(“du | bis | lb”,df$locu 01)
谢谢@digEmAll。我尝试将此应用于我的特定问题,并收到一条警告消息“输入字符串317在此区域设置中无效”。根据您的示例,我的代码是:clean$seriesReadery您可能在FavoriteSciFiFantasySeries中有一些字符,而您的区域设置不支持这些字符。。。您可以尝试遵循此线程中的建议:
df$loc01 <- ifelse(grepl("non",df$loc_01),'outside','inside')
> df
loc_01 loc01_land loc01
1 apis 165730500 inside
2 indu 62101800 inside
3 isro 540687600 inside
4 miss 161140500 inside
5 non_apis 1694590200 outside
6 non_indu 1459707300 outside
7 non_isro 1025051400 outside
8 non_miss 1419866100 outside
9 non_piro 2037064500 outside
10 non_sacn 2204629200 outside
11 non_slbe 1918840500 outside
12 non_voya 886299300 outside
13 piro 264726000 inside
14 sacn 321003900 inside
15 slbe 241292700 inside
16 voya 530532000 inside
library(dplyr)
library(stringr)
df %>%
mutate(loc01 = if_else(str_starts(loc_01, "non_"), "outside", "inside"))
df %>%
mutate(loc01 = if_else(str_detect(loc_01, "^(non_)"), "outside", "inside"))
loc_01 loc01_land loc01
<chr> <dbl> <chr>
1 apis 165730500 inside
2 indu 62101800 inside
3 isro 540687600 inside
4 miss 161140500 inside
5 non_apis 1694590200 outside
6 non_indu 1459707300 outside
7 non_isro 1025051400 outside
8 non_miss 1419866100 outside
9 non_piro 2037064500 outside