从数字元素中删除不需要的 0 - R



New R-bie,

我正在尝试从数据帧df中清除 3 列数据。这些列由数值元素组成,其值范围为 0.19、687.00、49405、107.440、13764.000、1.740。出于此示例的目的,我将在下面创建df。目标是将这行代码实现到 dplyr 的变异函数中,以便从data.frame中清理一列数据。

例:

df <- c(1.560, 1.790, 3456.000, 1.0700, 0.16000, 1.347, 4.200)

我一直在尝试删除元素末尾的 0,以便它们都看起来像这样

df <- c(1.56, 1.79, 3456, 1.07, 0.16, 1.347, 4.20)

我可以通过运行下面的代码行来部分实现我想要的结果:

signif(df[1], 5) 
signif(df[2], 5) 
signif(df[3], 5) 
signif(df[4], 5) 
signif(df[5], 5)
signif(df[6], 5) 
signif(df[7], 5) 

使用 DF[7] 元素4.200返回4.2

尽管我必须一一做,否则如果我这样做:signif(df[1:6], 5),我会得到这个向量返回1.560 1.790 3456.000 1.070 0.160 1.347 4.200

  1. 我也尝试使用正则表达式在对象末尾提取 0 的模式,但我使用的任何量词或表达式似乎都删除了所有尾随零。 我正在考虑删除最后一个数字(如果它是 0),以保留像1.347这样的数字,但清理列的其余部分,然后删除".00"的完全匹配以获得一个完整的整数,留下3456和"4.20"。 当使用"(\.000)$"匹配和删除 0 时(例如。4128.000, 13764.000),其他元素也删除了它们的 0(例如。4.20.9)而不是留下4.2000.900,我想从中提取4.200.90。 使用"(0)$"也不起作用,我已经尝试了大量的正则表达式变体来实现这一点......任何EHLP将不胜感激。

确实,尾随的"000"随着使用该模式的subgsub而消失,但不是因为模式与任何字符匹配。相反,这完全是因为最初转换为"字符"类:

>  df <- c(1.560, 1.790, 3456.000, 1.0700, 0.16000, 1.347, 4.200)
> 
> sub("\.000","",df)
[1] "1.56"  "1.79"  "3456"  "1.07"  "0.16"  "1.347" "4.2"  
> as.character(df)  #no `sub(` at all
[1] "1.56"  "1.79"  "3456"  "1.07"  "0.16"  "1.347" "4.2"  

如果你想在小数点右边有 2 位数字,你可以这样做:

format(as.vector(df), digits=2)
[1] "   1.56" "   1.79" "3456.00" "   1.07" "   0.16" "   1.35" "   4.20"

为了摆脱引号,请使用print(尽管它们仍然是字符值,因此您不能在该结果上使用算术运算符。

print(format(as.vector(df), digits=2) , quote=FALSE)
[1]    1.56    1.79 3456.00    1.07    0.16    1.35    4.20

最新更新