使用R tidyr::unite合并列时如何避免空白字符列被删除?
问题原因
- 核心逻辑错误:你用
substring()提取超出字符串长度的位置时,返回的是长度为0的空字符串"",不是你预期的占位空格,拼接后自然不会有空白占位。 - 代码笔误:创建
ndi数据框时,漏掉了名字第10位对应的column_30,就算空格问题解决也会少一位字符。 - 额外注意:Excel读取csv时默认会自动删除单元格末尾的空格,就算R里生成了正确的带空格内容,导出csv时如果不加处理,Excel也会把空格删掉。
最优解法(无需拆分单列)
你完全不需要把姓名拆成单个字符的列,直接用字符串截断+填充函数即可实现固定长度输出,代码量减少90%:
# 未安装stringr包请先运行 install.packages("stringr") library(stringr) # 处理姓氏:截断到20字符,不足20位时右侧补空格,总长度固定为20 last_fixed <- str_pad( str_trunc(cases_alive$last, width = 20, side = "right", ellipsis = ""), width = 20, side = "right", pad = " " ) # 处理名字:截断到15字符,不足15位时右侧补空格,总长度固定为15 first_fixed <- str_pad( str_trunc(cases_alive$first, width = 15, side = "right", ellipsis = ""), width = 15, side = "right", pad = " " ) # 直接拼接生成最终字段 ndi <- data.frame(ndi_col = paste0(last_fixed, first_fixed))
导出csv注意事项
导出csv时开启文本引号,避免Excel自动删除末尾空格:
write.csv(ndi, "ndi_output.csv", quote = TRUE, row.names = FALSE, na = "")
原拆列方法修复(不推荐)
如果你一定要沿用原来的拆列逻辑,需要把每个substring返回的空字符串替换为空格,同时补回漏掉的column_30:
# 单个列处理示例,其余34个列都要按这个逻辑修改 column_1 <- ifelse(substring(cases_alive$last, 1, 1) == "", " ", substring(cases_alive$last, 1, 1)) # ... 其余34个列的替换逻辑 # 创建数据框时补回column_30 ndi <- data.frame(column_1, column_2, ..., column_30, column_31, ..., column_35)
内容的提问来源于stack exchange,提问作者Marcos
相关产品推荐
相关产品推荐

