使用 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
要应用的规则:
- 如果代码以 "E" 开头且代码长度 > 4:介于字符 4 和 5 之间。
- 如果代码长度 > 3 并且代码不是以 "E" 开头:在字符 3 和 4 之间。
- 如果代码长度 <= 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)
.
我有一个数据框 "df" 并想应用 if/else 条件为整个列插入一个小数点 "A"
A B
E0505 123
890 43
4505 56
要应用的规则:
- 如果代码以 "E" 开头且代码长度 > 4:介于字符 4 和 5 之间。
- 如果代码长度 > 3 并且代码不是以 "E" 开头:在字符 3 和 4 之间。
- 如果代码长度 <= 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)
.