问题描述
新 R-bie,
我正在尝试从我的数据框 df
中清除 3 列数据。这些列由数值范围为 0.19、687.00、49405、107.440、13764.000、1.740 的数字元素组成。出于本示例的目的,我将在下面创建 df
。目标是将这行代码实现到 dplyr 的 mutate 函数中,以便清除 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,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
- 我还尝试使用正则表达式来提取对象末尾的 0 模式,但我使用的任何量词或表达式似乎都删除了所有尾随零。
我想删除最后一位数字,如果它是 0,保留
1.347
之类的数字,但清理列的其余部分,然后删除".00"
的完全匹配以得到一个整体整数离开3456
和 '4.20'。 当使用"(\\.000)$"
从(例如4128.000,13764.000
)匹配和删除 0 时,其他元素也会删除它们的 0(例如4.2
、0.9
)而不是离开 {{ 1}} 和4.200
,我想从中提取0.900
和4.20
。 使用0.90
也不起作用,我已经尝试了大量的正则表达式变体来实现这一点...任何 ehlp 都将不胜感激。
解决方法
尾随的“000”确实会随着使用该模式的 sub
或 gsub
而消失,但不是因为该模式与任何字符匹配。相反,这完全是因为最初转换为“字符”类:
> 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