【问题标题】:How to round/format a vector of numbers dynamically without using a loop?如何在不使用循环的情况下动态舍入/格式化数字向量?
【发布时间】:2021-10-08 22:49:48
【问题描述】:

我有两个数字向量:v1v2 第一个是一组实数。第二个是一组小数位,我想四舍五入或格式化v1

这里是向量:

v1 <- c(7.449835, 6.649058, 9.072736, 5.643506, 8.979166, 5.544238, 1.746717, 4.151327, 8.408533, 1.176206)
v2 <- c(1, 2, 0, 3, 4, 6, 1, 2, 2, 3)

我想要的结果是这样的:

[1] 7.4 6.64 9 5.643 8.9791 5.544238 1.7 4.15 8.40 1.176

...第一个向量根据第二个向量进行舍入/格式化。我不在乎结果是字符还是数字向量。但是最后,数字很多,我不想使用循环:

请注意,这不起作用:

format(v1, digits = v2)
 [1] "7" "7" "9" "6" "9" "6" "2" "4" "8" "1"

这不起作用:

round(v1, digits = v2)
[1] 7.400000 6.650000 9.000000 5.644000 8.979200 5.544238 1.700000 4.150000 8.410000 1.176000

那么,如何在不使用 R 循环的情况下动态舍入或格式化矢量?

【问题讨论】:

  • 我只是通过删除数字来模拟想要的结果。四舍五入就好了。

标签: r


【解决方案1】:

?sprintf fmt 参数可以采用“格式字符串的字符向量”。

因此,您可以通过使用 sprintf 格式语法粘贴格式数字向量来将格式拼凑在一起,例如paste0("%#.", v2, "f").

大家一起

sprintf(v1, fmt=paste0("%#.", v2, "f"))

【讨论】:

  • “9”。困扰着我,但我可以弄清楚。谢谢。
  • 这似乎可以做到 sprintf(v1, fmt=paste0("%.", v2, "f")) 。更新答案
  • 实际上回滚,因为它没有按预期处理整数,请参阅sprintf(1, fmt=paste0("%.", 1, "f"))。我相信会有办法的!!#
  • 是的,它最终为“1.0000”。不过,让我们在上面留下您的评论,因为它可能在正确的情况下有用。如果你总是以浮点数开头。
  • 实际上我认为评论可能还可以......我让自己感到困惑。我的意思是 sprintf(1, fmt=paste0("%.", 0, "f")) 按预期工作。
【解决方案2】:

您可以使用round,然后删除尾随零为suggested in this answer

v1 <- c(7.449835, 6.649058, 9.072736, 5.643506, 8.979166, 5.544238, 1.746717, 4.151327, 8.408533, 1.176206)
v2 <- c(1, 2, 0, 3, 4, 6, 1, 2, 2, 3)
v1 <- round(v1, digits = v2)
v1 <- sub("0+$", "", as.character(v1))

【讨论】:

  • 我实际上并没有注意到 round() 除了额外的零之外正在工作。感谢您指出这一点。
【解决方案3】:

如果你先四舍五入然后应用 as.character 你会得到想要的输出:

mapply(function(x,y){as.character(round(x,y))}, v1, v2)
#[1] "7.4"      "6.65"     "9"        "5.644"    "8.9792"   "5.544238" "1.7"      "4.15"     "8.41"     "1.176"   

# to get without quotes use `cat` or `print( ... , quote=FALSE)`
cat( mapply(function(x,y){as.character(round(x,y))}, v1, v2))
#7.4 6.65 9 5.644 8.9792 5.544238 1.7 4.15 8.41 1.176

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-05
    • 1970-01-01
    • 2014-05-26
    相关资源
    最近更新 更多