Я пытаюсь добавить ".0" на любые однозначные числа в моем векторе - PullRequest
0 голосов
/ 22 февраля 2019

Может кто-нибудь объяснить, почему этот код не работает?Я хочу, чтобы символьный вектор nums выводил "4.4" "" 5.0 ", но я получаю сообщение об ошибке.Кое-что о do.call().

В дополнение к знанию, почему это происходит, кто-то может предоставить более простой способ превратить «5» в «5,0», но оставить другие числа такими, какие они есть.Пожалуйста, имейте в виду, что у меня на самом деле много чисел, поэтому что-то вроде nums[3] <- "5.0" не будет полезным.

y <- 0
nums <- c("4.4", "", "5")

for(x in nums){

  y <- 0 + 1

  if(nchar(x) == 1){
    nums[y] <- paste(x, ".0", sep = "")
  }else{}
}

При выполнении кода выше я получаю следующее сообщение об ошибке:

Ошибка в do.call (base :: call, c (name = "{", else_lines),quote = TRUE): второй аргумент должен быть списком

Ответы [ 7 ]

0 голосов
/ 22 февраля 2019

Попробуйте:

gsub("^([0-9]$)()","\\1.0\\2",nums,perl=TRUE)

Результат:

[1] "4.4" ""    "5.0"
0 голосов
/ 22 февраля 2019

Аналогично решению Даррена

x <- sprintf("%.1f", as.numeric(c("4.4", "", "5")))
replace(x, is.na(x), "")
[1] "4.4" ""    "5.0"
0 голосов
/ 22 февраля 2019

Использование вашей логики с векторизованным ifelse() вместо for цикла:

nums <- c("4.4", "", "5")
ifelse(nchar(nums) == 1, paste0(nums, ".0"), nums)
# [1] "4.4" ""    "5.0"
0 голосов
/ 22 февраля 2019

С помощью sub:

nums1 <- c("4.4", "", "5")
sub('^(\\d)$', '\\1.0', nums1)
# [1] "4.4" ""    "5.0"

или мы можем добавить +, чтобы обобщить его на любое количество цифр без десятичного знака:

nums2 <- c("4.4", "", "5", "15.5", "20")
sub('^(\\d+)$', '\\1.0', nums2)
# [1] "4.4"  ""     "5.0"  "15.5" "20.0"
0 голосов
/ 22 февраля 2019

Вы можете решить это с помощью format():

x <- format(as.numeric(nums), nsmall = 1, trim = T)
x[x == "NA"] <- ""
x
# [1] "4.4" ""    "5.0"

Аргумент nsmall управляет минимальным количеством цифр справа от десятичной точки при форматировании действительных / комплексных чисел в ненаучных форматах.,Например:

format(12.3, nsmall = 3)
# [1] "12.300"
0 голосов
/ 22 февраля 2019

Можно попробовать:

gsub("(?<!\\.)(\\d)$", "\\1\\.0", nums, perl = T)

Увеличенный пример:

nums <- c("4.4", "", "5", "34.5", "555", "-4", "-4.4", "-34.4")

Вывод:

[1] "4.4"   ""      "5.0"   "34.5"  "555.0" "-4.0"  "-4.4"  "-34.4"

Это в основном ищет любое число ((\\d)), котороеприсутствует в конце строки ($) и не имеет . перед ним ((?<!\\.)).

Идея этого негативного взгляда заключается в том, что он может также функционировать в случаях отрицательных значений.

0 голосов
/ 22 февраля 2019

Проверьте наличие точек и добавьте 0, если необходимо:

nums <- c("4.4", "", "5")
points <- grepl("\\.", nums)
nums[!points & nchar(nums) > 0] <- paste0(nums[!points & nchar(nums) > 0], ".0")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...