提取babynames数据集姓名中间字符:6字符姓名结果异常排查
问题原因分析
你的代码异常核心是条件判断逻辑错误,错把「判断姓名长度的奇偶性」写成了「判断length/2的奇偶性」:
- 对于长度为6的姓名,
length/2 = 3,3 %% 2 != 0结果为TRUE,触发了奇数长度的分支,只提取了第3个字符(比如Minnie的第3位是n),而不是预期的中间两个字符(第3和第4位)。 - 正确的判断逻辑应该是直接检查姓名长度本身是否为奇数:
length %% 2 != 0。
修正后的代码
library(tidyverse) library(babynames) babynames |> mutate( length = str_length(name), middle = if_else(length %% 2 != 0, str_sub(name, ceiling(length / 2), ceiling(length / 2)), str_sub(name, length / 2, (length / 2)+1) ) )
额外优化建议
可以用整数除法简化索引计算,让代码更清晰:
- 奇数长度:中间位置是
(length + 1) %/% 2 - 偶数长度:起始位置是
length %/% 2,结束位置是length %/% 2 + 1
优化后代码:
babynames |> mutate( length = str_length(name), middle = if_else(length %% 2 != 0, str_sub(name, (length + 1) %/% 2, (length + 1) %/% 2), str_sub(name, length %/% 2, length %/% 2 + 1) ) )
内容的提问来源于stack exchange,提问作者Sourav_Hasan
相关产品推荐
相关产品推荐

