You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用R tidyr::unite合并列时如何避免空白字符列被删除?

问题原因
  1. 核心逻辑错误:你用substring()提取超出字符串长度的位置时,返回的是长度为0的空字符串"",不是你预期的占位空格,拼接后自然不会有空白占位。
  2. 代码笔误:创建ndi数据框时,漏掉了名字第10位对应的column_30,就算空格问题解决也会少一位字符。
  3. 额外注意: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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.10 17:33:04