在R中计算数值向量中数字的数量

6

我有一个R语言的数字向量:

 c(0.9, 0.81)

我希望能够提取此向量中每个元素的数字数量。在这种情况下,该命令将返回12,因为数字是981。是否有一种方便的方法来实现?如果结果是1,如何扩展到两位数字?例如,我想要返回的向量是

 c(0.90, 0.81)

1
尝试使用format(v1, nsmall=2)进行打印或者sprintf('%.2f', v1)。您想将其返回为numeric类吗?也许可以使用round(v1,2) - akrun
在控制台中输入 v,您将得到 0.900.81。向量会自动打印出所有元素中最高位数的数字。 - Rich Scriven
我需要创建一个相同的函数(用于计算数字向量中数字的数量,假设向量中只有一个对象),但我必须使用 'while' 循环完成。 有什么想法吗? - Jneven
2个回答

8

要计算小数点后的位数,您可以使用 nchar 函数。

sapply(v, nchar) - 2  # -2 for "." and leading 0
# 1 2

4
或者 nchar(sub('.*\\.', '', v1))。顺便说一句,nchar(v1)-2 也应该可以。 - akrun
5
您可能需要说明这并非一般情况。例如32.52 - akrun
@akrun 是的,就像 akrun 所说的那样。 - Rorschach

5
x <- c(0.9,0.81,32.52,0);
nchar(sub('^0+','',sub('\\.','',x)));
## [1] 1 2 4 0

该代码会去除小数点,然后去掉所有的前导零,并最终使用字符串长度作为计算有效数字数量的间接手段。如果输入为零,则自然地返回零,但是如果您愿意,可以使用 if 表达式显式测试该情况并返回1。

正如akrun提到的那样,要在小数点后打印两个数字:

sprintf('%.2f',x);
## [1] "0.90"  "0.81"  "32.52" "0.00"

这个答案有一个 bug。即使小数点后面有前导零,它也会去掉。因此,“0.0001”会给出答案 1,尽管正确答案是 4。我想指出这一点,因为这个答案是被接受的答案。 - Phil
@Phil 0.0001的正确答案是1。前导零通常不被认为是有效数字,即使它们出现在小数点后面。 - bgoldst

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接