当前位置: 动力学知识库 > 问答 > 编程问答 >

regex - ifelse pattern matching in r

问题描述:

I would like to fill in a new column with one of two values if a pattern is matched.

Here is my data frame:

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"))

And looks like this...

 loc_01 loc01_land

1 apis 165730500

2 indu 62101800

3 isro 540687600

4 miss 161140500

5 non_apis 1694590200

6 non_indu 1459707300

7 non_isro 1025051400

8 non_miss 1419866100

9 non_piro 2037064500

10 non_sacn 2204629200

11 non_slbe 1918840500

12 non_voya 886299300

13 piro 264726000

14 sacn 321003900

15 slbe 241292700

16 voya 530532000

I would like to add a column to df, called 'loc_01'. If loc_01 contains non, then return 'outside', if it does not contain non, then return 'inside'. This is my ifelse statement, but I'm missing something because it only returns the false value.

df$loc01 <- ifelse(df$loc_01=="non",'outside','inside')

And the resulting 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 inside

6 non_indu 1459707300 inside

7 non_isro 1025051400 inside

8 non_miss 1419866100 inside

9 non_piro 2037064500 inside

10 non_sacn 2204629200 inside

11 non_slbe 1918840500 inside

12 non_voya 886299300 inside

13 piro 264726000 inside

14 sacn 321003900 inside

15 slbe 241292700 inside

16 voya 530532000 inside

Thanks

-al

网友答案:

To check if a string contains a certain substring, you can't use == because it performs an exact matching (i.e. returns true only if the string is exactly "non").
You could use for example grepl function (belonging to grep family of functions) that performs a pattern matching:

df$loc01 <- ifelse(grepl("non",df$loc_01),'outside','inside')

Result :

> 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
分享给朋友:
您可能感兴趣的文章:
随机阅读: