截取字符字符串的前N个字符

14
我有一个字符串向量,其长度从3个字符到59个字符不等。我想要将任何长度超过13个字符的字符串截断为10个字符并在后面加上“...”。例如,如果字符串是
a <- c("AMS", "CCD", "TCGGCKGTPGPHOLKP", "NOK", "THIS IS A LONG STRING", "JSQU909LPPLU")

然后我想获得

"AMS"   "CCD"   "TCGGCKGTPG..."   "NOK"   "THIS IS A ..."   "JSQU909LPPLU"

我确定这需要一个if语句和gsub函数,但我的问题在于gsub。有什么想法吗?


1
请分享你遇到问题的代码。你使用了什么模式? - Wiktor Stribiżew
根据您所描述的规则,"THIS IS A LONG STRING" 应该变成 "THIS IS A LON..." 而不是像例子中的 "THIS IS A ..."。这是一个矛盾的规范。 - janos
4个回答

18

已经有一个封装好的函数可以执行这个操作。请尝试使用stringr包中的str_trunc()函数,将宽度设置为13(10个字符+3个点)。

stringr::str_trunc(a, 13)
# [1] "AMS"           "CCD"           "TCGGCKGTPG..." "NOK"           
# [5] "THIS IS A ..." "JSQU909LPPLU" 

10
使用ifelsesubstring的解决方案:
编辑(在@G5W评论后):
a <- c("AMS", "CCD", "TCGGCKGTPGPHOLKP", "NOK", "THIS IS A LONG STRING", "JSQU909LPPLU")
ifelse(nchar(a) > 13, paste0(substring(a, 1, 10), "..."), a)

3
如果a的字符数大于13,则输出前10个字符并加上省略号,否则输出a本身。简化后的代码为:ifelse(nchar(a) > 13, paste0(substring(a, 1, 10), "..."), a) - G5W

6

我认为最简单的方法是使用substr,它不需要任何包。

      a <- c("AMS", "CCD", "TCGGCKGTPGPHOLKP", "NOK", "THIS IS A LONG STRING","JSQU909LPPLU")
  
 #It will keep only chars from 1-10 for each element
      substr(a,1,10)

[1] "AMS"        "CCD"        "TCGGCKGTPG" "NOK"        "THIS IS A "
[6] "JSQU909LPP"

3

一种更快的...

ifelse(nchar(a) > 13, paste0(strtrim(a, 10), '...'), a)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接