Держите значительные нули при переключении столбца в форматирование символов в R - PullRequest
0 голосов
/ 19 октября 2018

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

Я уверен, что есть лучший способ, просто надеяться, что некоторые люди с большим знанием, чем я, смогут пролить немного света.Большинство вопросов в Интернете касаются лидирующих нулей или форматирования чисто числовых столбцов, но аспект символа «<» в моих данных заставляет меня задуматься о правильном способе сделать это. </p>

df      = as.factor(c("0.01","5.231","<0.02","0.30","0.801","2.302"))
ind     = which(df %in% "<0.02")       # Locate the below detection value.
df[ind] <- NA                          # Substitute NA temporarily 
df      = as.numeric(as.character(df)) # Changes to numeric column
df      = round(df, digits = 2)        # Rounds to hundredths place
ind1    = which(df < 0.02)             # Check for below reporting limit values
df      = as.character(df)             # Change back to character column...
df[c(ind,ind1)] = "<0.02"              # so I can place the reporting limit back

> # RESULTS::
> df
[1] "<0.02" "5.23"  "<0.02" "0.3"   "0.8"   "2.3"

Однако,4-е, 5-е и 6-е значения в данных больше не сообщают ноль в сотом месте.Каков будет правильный порядок действий для этого?Возможно, изменение столбца обратно на символ неверно?Любой совет будет оценен.

Спасибо.

РЕДАКТИРОВАТЬ: ---- По рекомендации от hrbrmstr и Mike: Спасибо за совет.Я попробовал следующее, и они оба приводят к одной и той же проблеме.Возможно, есть другой способ индексирования / замены значений?

формат, та же проблема:

#... code from above...
ind1    = which(df < 0.02)
df      = as.character(df)
df[!c(ind,ind1)] = format(df[!c(ind,ind1)],digits=2,nsmall=2)
> df
[1] "<0.02" "5.23"  "<0.02" "0.3 "  "0.8 "  "2.3 " 

sprintf, та же проблема:

# ... above code from example ...
ind1 = which(df < 0.02)   # Check for below reporting limit values.
sprintf("%.2f",df)        # sprintf attempt.
[1] "0.01" "5.23" "NA"   "0.30" "0.80" "2.30"
df[c(ind,ind1)] = "<0.02" # Feed the symbols back into the column.
> df
[1] "<0.02" "5.23"  "<0.02" "0.3"   "0.8"   "2.3"  #Same Problem.

Пробовал другойспособ замены значений и та же проблема.

# ... above code from example ...
> ind1    = which(df < 0.02)
> df[c(ind,ind1)] = 9999999
> sprintf("%.2f",df)
[1] "9999999.00" "5.23"       "9999999.00" "0.30"       "0.80"       "2.30" 
> gsub("9999999.00","<0.02",df)
[1] "<0.02" "5.23"  "<0.02" "0.3"   "0.8"   "2.3"  #Same Problem.

1 Ответ

0 голосов
/ 19 октября 2018

Вы можете просто добавить его с помощью gsub и небольшого количества регулярных выражений ...

df <- c("<0.02", "5.23", "<0.02", "0.3", "4",  "0.8",   "2.3")

gsub("^([^\\.]+)$", "\\1\\.00", gsub("\\.(\\d)$", "\\.\\10", df))

[1] "<0.02" "5.23"  "<0.02" "0.30"  "4.00"  "0.80"  "2.30" 

Первый gsub ищет точку, за которой следуют одна цифра и конец-строка и заменяет цифру (группа захвата \\1) на себя, за которой следует ноль.Второй проверяет числа без точек и добавляет .00 в конец.

...