R使用带通配符的gsub删除部分字符串

R remove part of string using gsub with wildcard

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

  1. 添加一个space作为千位分隔符
  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$ 以便它也查看前面有数字的零,但是这会删除小数点后的数字,这不是我想要的。

这可行,但您的号码将转换为 strings/character!

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

您可以使用参数 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"