首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >使用r修改连字符连接的数据

使用r修改连字符连接的数据
EN

Stack Overflow用户
提问于 2013-03-02 05:15:30
回答 4查看 508关注 0票数 2

我正在从csv文件读取数据,数据中的一列有三种不同的格式:

代码语言:javascript
运行
复制
xxxxx-xxx-xx (5-3-2)
xxxxx-xxxx-x (5-4-1)
xxxx-xxxx-xx (4-4-2)

我的目标是将这三种不同的样式转换为以下形式的样式: xxxxx-xxxx-xx (5-4-2)

为了使所有不同的形式都相同,我需要在3个不同条件的特定位置插入一个额外的零,如下所示:

代码语言:javascript
运行
复制
xxxxx-0xxx-xx
xxxxx-xxxx-0x
0xxxx-xxxx-xx

有谁对实现这一目标的最好方法有想法吗?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2013-03-02 05:28:07

我将使用sprintfstrsplit来完成此操作

代码语言:javascript
运行
复制
x <- c('11111-111-11', '11111-1111-1', '1111-1111-11')
y <- strsplit(x, '-')
myfun <- function(y) {
  first <- sprintf('%05d', as.integer(y[1]))
  second <- sprintf('%04d', as.integer(y[2]))
  third <- sprintf('%02d', as.integer(y[3]))

  paste(first, second, third, sep='-')
}

sapply(y, myfun)
# [1] "11111-0111-11" "11111-1111-01" "01111-1111-11"

您也可以使用花哨的正则表达式或gsubfn包来做到这一点,但这可能有些过分了!

票数 8
EN

Stack Overflow用户

发布于 2013-03-02 05:56:38

Justin的解决方案稍短一些,是一个更函数式的编程版本

代码语言:javascript
运行
复制
numbers <- c('11111-111-11', '11111-1111-1', '1111-1111-11')
restyle <- function(number, fmt){
  tmp <- as.list(as.integer(strsplit(number, '-')[[1]]))
  do.call(sprintf, modifyList(tmp, list(fmt = fmt)))
}

sapply(numbers, restyle, fmt = '%05d-%04d-%02d', USE.NAMES = F)
票数 5
EN

Stack Overflow用户

发布于 2013-03-02 05:39:02

您是否在类似unix的环境中工作?在命令行中使用sed可能比使用R的regex函数更容易。

代码语言:javascript
运行
复制
echo "54324-965-23" | sed 's/\(.....\)-\(...\)-\(..\)/\1-0\2-\3/'

都会吐出来

代码语言:javascript
运行
复制
54324-0965-23

如果要将其应用于整个文件,则如下所示

代码语言:javascript
运行
复制
cat file1.txt | sed 's/\(.....\)-\(...\)-\(..\)/\1-0\2-\3/' > file2.txt

如果你有多个txt修改操作,你可以把它们都放在一起。

代码语言:javascript
运行
复制
cat file1.txt | sed 's/\(.....\)-\(...\)-\(..\)/\1-0\2-\3/' | sed '2ndthing' | sed 'thirdthing' > file2.txt
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15167010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档