R удалить часть строки, используя gsub с подстановочным знаком

У меня есть датафрейм, где я хочу сделать две вещи со значениями:

  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$ так что он также смотрит на нули с числом перед ним, но это удаляет число после десятичной дроби, а это не то, что я хочу.

2 ответа

Решение

Вы можете использовать аргумент 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"

Или используйте trim аргумент format:

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

Это будет работать, но ваши числа будут преобразованы в строки / символы!

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
Другие вопросы по тегам