【问题标题】:Remove leading zeros in numbers *within a data frame*删除数字中的前导零*在数据框内*
【发布时间】:2018-12-14 20:02:15
【问题描述】:

编辑:对于以后来的人:这不是重复的,因为它明确涉及数据帧的工作,而不是单个变量/向量。


我发现几个网站描述了如何删除数字或字符串中的前导零,包括向量。但我发现的任何描述似乎都不适用于数据框。

numform 包中的f_num 函数。它处理“[a] 数字向量(或字符串等价物)”,但似乎无法解决数据框中不需要的前导零。

我对 R 比较陌生,但我知道我可以开发一些(在我看来)复杂的代码,通过对数据帧中的向量进行子集化,然后将这些向量组合成一个完整的数据帧来删除前导零。我想避免这种情况。

这是一个简单的数据框:

df <-  structure(list(est = c(0.05, -0.16, -0.02, 0, -0.11, 0.15, -0.26, 
-0.23), low2.5 = c(0.01, -0.2, -0.05, -0.03, -0.2, 0.1, -0.3, 
-0.28), up2.5 = c(0.09, -0.12, 0, 0.04, -0.01, 0.2, -0.22, -0.17
)), row.names = c(NA, 8L), class = "data.frame")

这给了

df
    est low2.5 up2.5
1  0.05   0.01  0.09
2 -0.16  -0.20 -0.12
3 -0.02  -0.05  0.00
4  0.00  -0.03  0.04
5 -0.11  -0.20 -0.01
6  0.15   0.10  0.20
7 -0.26  -0.30 -0.22
8 -0.23  -0.28 -0.17

我想要

est low2.5 up2.5
1  .05   .01  .09
2 -.16  -.20 -.12
3 -.02  -.05  .00
4  .00  -.03  .04
5 -.11  -.20 -.01
6  .15   .10  .20
7 -.26  -.30 -.22
8 -.23  -.28 -.17

整个数据框的代码相对简单吗?


编辑:已删除不正确的链接。

【问题讨论】:

  • 您只需要应用指定列的给定函数。 SO上有很多这样的问题。
  • 我到底做了什么?你浏览了我附上的链接吗?这是一个重复的问题。
  • 答案是:与向量相同的方式,您只需要遍历列。您可以将链接答案用于向量、data.frames、列表和其他结构。给定的解决方案不会改变。
  • 我不会和你讨论。你显然误解了我的意图和这个网站的运作方式。
  • 请不要删除这个帖子,重复的帖子有用的。所以欢迎大家初学者或不。但不要亲自投票/关闭投票,给它时间这篇文章只有 5 小时的历史。

标签: r dataframe


【解决方案1】:

我正在解释您问题的意图是将data.frame 中的每个数字单元格转换为“漂亮打印”的字符串,这可以使用字符串替换和简单的正则表达式(顺便说一句,这是一个很好的问题,因为我没有知道任何配置数字数据输出以抑制前导零而不将数字数据转换为字符串的方法!):

df2 <- data.frame(lapply(df,
                         function(x) gsub("^0\\.", "\\.", gsub("^-0\\.", "-\\.", as.character(x)))),
                  stringsAsFactors = FALSE)
df2
#    est low2.5 up2.5
# 1  .05    .01   .09
# 2 -.16    -.2  -.12
# 3 -.02   -.05     0
# 4    0   -.03   .04
# 5 -.11    -.2  -.01
# 6  .15     .1    .2
# 7 -.26    -.3  -.22
# 8 -.23   -.28  -.17

str(df2)
# 'data.frame': 8 obs. of  3 variables:
# $ est   : chr  ".05" "-.16" "-.02" "0" ...
# $ low2.5: chr  ".01" "-.2" "-.05" "-.03" ...
# $ up2.5 : chr  ".09" "-.12" "0" ".04" ...

如果您想获得小数点后的固定位数(如预期输出中所示,但未明确要求),您可以使用sprintfformat

df3 <- data.frame(lapply(df, function(x) gsub("^0\\.", "\\.", gsub("^-0\\.", "-\\.", sprintf("%.2f", x)))), stringsAsFactors = FALSE)
df3
#    est low2.5 up2.5
# 1  .05    .01   .09
# 2 -.16   -.20  -.12
# 3 -.02   -.05   .00
# 4  .00   -.03   .04
# 5 -.11   -.20  -.01
# 6  .15    .10   .20
# 7 -.26   -.30  -.22
# 8 -.23   -.28  -.17

注意:此解决方案对于不同的小数点字符(不同的语言环境)稳健 - 它总是需要小数点...

【讨论】:

  • 谢谢你,R Yoda。您的代码工作正常,是我介绍的问题的解决方案。一个文本列(未包含在我的示例中)仍然被删除,但这很容易解决。正如您正确指出的那样,数字单元格被转换为字符串,这在我的特定情况下不是一件好事;我使用 knitr 和 kableExtra 来开发表格。 (我只能希望@Sotos 和其他人学会少评判。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-30
  • 1970-01-01
  • 2011-10-04
  • 2014-06-25
相关资源
最近更新 更多