有人可以解释为什么此代码不起作用吗?我希望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)错误: 第二个参数必须是列表
答案 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"