Удалить начальные нули в числах * внутри фрейма данных * - PullRequest
0 голосов
/ 12 декабря 2018

Редактировать: Для всех, кто придет позже: ЭТО НЕ ДУБЛИКАТ, поскольку оно явно касается работы с фреймами данных, а не с отдельными переменными / векторами.


Я нашел несколько сайтов, описывающих, как отбрасывать начальные нули в числах или строках, включая векторы.Но ни одно из описаний, которые я нашел, не подходит для фреймов данных.

Или функция f_num в пакете numform.Он обрабатывает «[вектор] чисел (или строковых эквивалентов)», но, по-видимому, не решает нежелательные начальные нули в кадре данных.

Я относительно новичок в R, но понимаю, что мог бы разработать некоторый (на мой взгляд) сложный код для отбрасывания ведущих нулей путем подстановки векторов из фрейма данных и последующего объединения этих векторов в полный фрейм данных.Я хотел бы избежать этого.

Вот простой фрейм данных:

df <-  structure(list(est = c(0.05, -0.16, -0.02, 0, -0.11, 0.15, -0.26, 
-0.23), low2.5 = c(0.01, -0.2, -0.05, -0.03, -0.2, 0.1, -0.3, 
-0.28), up2.5 = c(0.09, -0.12, 0, 0.04, -0.01, 0.2, -0.22, -0.17
)), row.names = c(NA, 8L), class = "data.frame")

, который дает

df
    est low2.5 up2.5
1  0.05   0.01  0.09
2 -0.16  -0.20 -0.12
3 -0.02  -0.05  0.00
4  0.00  -0.03  0.04
5 -0.11  -0.20 -0.01
6  0.15   0.10  0.20
7 -0.26  -0.30 -0.22
8 -0.23  -0.28 -0.17

Я бы хотел

est low2.5 up2.5
1  .05   .01  .09
2 -.16  -.20 -.12
3 -.02  -.05  .00
4  .00  -.03  .04
5 -.11  -.20 -.01
6  .15   .10  .20
7 -.26  -.30 -.22
8 -.23  -.28 -.17

Это возможно при относительнопростой код для всего фрейма данных?


Редактировать: неверная ссылка была удалена.

1 Ответ

0 голосов
/ 14 декабря 2018

Я понимаю, что ваш вопрос состоит в том, чтобы преобразовать каждую числовую ячейку в data.frame в «довольно напечатанную» строку, которая возможна с помощью подстановки строк и простого регулярного выражения (хороший вопрос, кстати, поскольку я незнать любой способ настройки вывода числовых данных для подавления начальных нулей без преобразования числовых данных в строку!):

df2 <- data.frame(lapply(df,
                         function(x) gsub("^0\\.", "\\.", gsub("^-0\\.", "-\\.", as.character(x)))),
                  stringsAsFactors = FALSE)
df2
#    est low2.5 up2.5
# 1  .05    .01   .09
# 2 -.16    -.2  -.12
# 3 -.02   -.05     0
# 4    0   -.03   .04
# 5 -.11    -.2  -.01
# 6  .15     .1    .2
# 7 -.26    -.3  -.22
# 8 -.23   -.28  -.17

str(df2)
# 'data.frame': 8 obs. of  3 variables:
# $ est   : chr  ".05" "-.16" "-.02" "0" ...
# $ low2.5: chr  ".01" "-.2" "-.05" "-.03" ...
# $ up2.5 : chr  ".09" "-.12" "0" ".04" ...

Если вы хотите получить фиксированное количество цифр после десятичной точки (какпоказано в ожидаемом выводе, но явно не запрашивается) вы можете использовать sprintf или format:

df3 <- data.frame(lapply(df, function(x) gsub("^0\\.", "\\.", gsub("^-0\\.", "-\\.", sprintf("%.2f", x)))), stringsAsFactors = FALSE)
df3
#    est low2.5 up2.5
# 1  .05    .01   .09
# 2 -.16   -.20  -.12
# 3 -.02   -.05   .00
# 4  .00   -.03   .04
# 5 -.11   -.20  -.01
# 6  .15    .10   .20
# 7 -.26   -.30  -.22
# 8 -.23   -.28  -.17

Примечание: Это решение не надежноепротив другого символа десятичной точки (разные локали) - он всегда ожидает десятичную точку ...

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...