我有一个数据框架" df",想在/其他条件下应用整个列的小数" a"
A B
E0505 123
890 43
4505 56
适用的规则:
- 如果代码以" E"开头,并且代码的长度为> 4:在字符4和5之间。
- 如果代码的长度为> 3,并且代码不以" E"开头:在字符3和4之间。
- 如果代码的长度为< = 3:返回代码。
最终输出:
A B
E050.5 123
890 43
450.5 56
我已经尝试过,但是我不确定如何包括行开头的条件与否。
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)
。