【问题标题】:R remove part of string using gsub with wildcardR使用带有通配符的gsub删除部分字符串
【发布时间】:2019-01-24 13:01:30
【问题描述】:

我有一个数据框,我想对值做两件事:

  1. 添加一个空格作为千​​位分隔符
  2. 删除小数点后的尾零

我设法分别做这两件事,但我似乎无法将两者结合起来。

为了删除我使用的尾随零:

cat <- c("A", "B", "C")
value <- c(1234.5, 1, 12.34)
df <- data.frame(cat, value)

df$value2 <- gsub("\\.00$","",df$value)
df
  cat   value value2
1   A 1234.50 1234.5
2   B    1.00      1
3   C   12.34  12.34

为了添加我使用的千位分隔符:

df$value2 <- format(df$value, big.mark=" ")
df
  cat   value   value2
1   A 1234.50 1 234.50
2   B    1.00     1.00
3   C   12.34    12.34

现在我希望将两者结合起来,但如果我使用以下代码进行此操作:

df$value2 <- gsub("\\.00$","",format(df$value, big.mark=" "))
df
  cat   value   value2
1   A 1234.50 1 234.50
2   B    1.00        1
3   C   12.34    12.34

仅在以两个零结尾的情况下删除尾随零。我尝试添加|\\..*0$,以便它还可以查看前面带有数字的零,但这会删除小数点后的数字,这不是我想要的。

【问题讨论】:

  • 你想要一个look-behind,或者你也可以使用捕获组 (\\..*)0$ 替换为 \\1
  • 也许format 中的drop0trailing 选项可以满足您的要求:format(x = df$value, big.mark = " ", drop0trailing = T)

标签: r gsub zero trailing


【解决方案1】:

您可以使用参数drop0trailing

format(value, big.mark=" ", drop0trailing=TRUE)
# [1] "1 234.5" "   1"    "  12.34"

也适用于formatC,不同之处在于默认情况下您没有前导空格:

formatC(value, big.mark=" ", drop0trailing=TRUE)
# [1] "1 234" "1"     "12.34"

或者使用formattrim 参数:

format(value, big.mark=" ", drop0trailing=TRUE, trim = TRUE)
# [1] "1 234.5" "1"       "12.34"  

【讨论】:

  • 比我的回答好!
  • 可能的增强:使用trimws() 去掉前导空格..
  • 啊,刚刚用formatC 更新了我的答案来解决这个问题,但是format 也有一个trim 参数,所以不需要trimws ;)
  • 这成功了!非常感谢!我想知道为什么我没有通过搜索诸如删除尾随零之类的东西来找到这个选项..
  • format 使用trim-argument 比formatC 快(有点)
【解决方案2】:

这可行,但您的数字将被转换为字符串/字符!

df$value2 <- gsub("0+$|\\.0+$","", as.character( format(df$value, big.mark=" ")))

#   cat   value   value2
# 1   A 1234.50  1 234.5
# 2   B    1.00        1
# 3   C   12.34    12.34

【讨论】:

  • 我知道,这不是问题,因为我只是使用结果以简洁的格式打印值。 :)
猜你喜欢
  • 1970-01-01
  • 2016-02-29
  • 2022-06-17
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多