R удалить часть строки, используя gsub с подстановочным знаком - PullRequest
0 голосов
/ 24 января 2019

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

  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 ]

0 голосов
/ 24 января 2019

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

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

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
...