我正在尝试将“ .0”添加到向量中的任何一位数字上

时间:2019-02-22 14:31:34

标签: r for-loop if-statement

有人可以解释为什么此代码不起作用吗?我希望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 :(得分:2)

您可以通过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"

答案 1 :(得分:1)

使用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"

答案 2 :(得分:1)

类似于达伦的解决方案

x <- sprintf("%.1f", as.numeric(c("4.4", "", "5")))
replace(x, is.na(x), "")
[1] "4.4" ""    "5.0"

答案 3 :(得分:0)

检查点并在需要时添加.0:

nums <- c("4.4", "", "5")
points <- grepl("\\.", nums)
nums[!points & nchar(nums) > 0] <- paste0(nums[!points & nchar(nums) > 0], ".0")

答案 4 :(得分:0)

可以尝试:

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)的末尾出现的任何数字($),并且前面没有.({{1} }。

这种负向查找背后的想法是,它也可以在负值的情况下起作用。

答案 5 :(得分:0)

使用矢量化ifelse()而不是for循环的逻辑:

nums <- c("4.4", "", "5")
ifelse(nchar(nums) == 1, paste0(nums, ".0"), nums)
# [1] "4.4" ""    "5.0"

答案 6 :(得分:0)

尝试:

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

结果:

[1] "4.4" ""    "5.0"