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

Using if/else statement to insert a decimal for a column based on starting letter and string length of the row using R

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

A         B
E0505   123
890      43
4505     56 

要应用的规则:

  1. 如果代码以 "E" 开头且代码长度 > 4:介于字符 4 和 5 之间。
  2. 如果代码长度 > 3 并且代码不是以 "E" 开头:在字符 3 和 4 之间。
  3. 如果代码长度 <= 3: return 代码本身。

最终输出:

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

使用正则表达式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).