使用if / else语句根据使用R的行的起始字母和字符串长度为列插入小数

时间:2018-04-03 03:20:29

标签: r dplyr tidyr stringr

我有一个数据框" df"并希望应用if / else条件为整列插入小数" A"

A         B
E0505   123
890      43
4505     56 

适用规则:

  1. 如果代码以" E"开头并且代码的长度是> 4:字符4和5之间。
  2. 如果代码的长度是> 3,代码不以" E"开头:字符3和4之间。
  3. 如果代码的长度是< = 3:返回代码。
  4. 最终输出:

    A          B
    E050.5   123
    890       43
    450.5     56
    

    我试过这个,但我不知道如何包含行以E开头的条件。

    ifelse(str_length(df$A)>3, as.character(paste0(substring(df$A, 1, 3),".", substring(df$A, 4))), as.character(df$A))
    

1 个答案:

答案 0 :(得分:3)

sub与正则表达式一起使用,您可以这样做:

df$A <- sub("((?:^E.|^[^E]).{2})(.+)", "\\1.\\2", df$A)

df
#       A   B
#1 E050.5 123
#2    890  43
#3  450.5  56

((?:^E.|^[^E]).{2})(.+)匹配字符串:

  • 案例1:以E开头,后跟4个或更多字符,在这种情况下捕获前4个字符,其余字符为两个单独的组,并在其间插入.;
  • 案例2:不是以E开头,而是有4个或更多字符,在这种情况下捕获前3个字符,其余字符为两个单独的组,并在其间插入.;

E开头并且总共少于5个字符或不以E开头并且总共少于4个字符的字符串不匹配,并且不会被修改。

如果忽略大小写:df$A <- sub("((?:^[Ee].|^[^Ee]).{2})(.+)", "\\1.\\2", df$A)