【问题标题】:tidyr::unite drops decimal 0tidyr::unite 丢弃小数点 0
【发布时间】:2018-12-11 19:07:41
【问题描述】:

我想在一个数据框中合并两列和两列的数字(列中的值是统计分析中置信区间的上限和下限)。

我的首选方法是使用tidyrunite 函数。但是以 0.20 为例,该数字将被修改为 0.2,即如果数字中的最后一个小数等于 0,则将它们删除。使用unite时有什么办法可以保持原来的格式吗?

unite 在这里描述:https://www.rdocumentation.org/packages/tidyr/versions/0.8.2/topics/unite

例子:

# Dataframe
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")

使用逗号作为分隔符将列与unite 组合(合并)以获得置信度

library(tidyr)
df <- unite(df, "CI", c("low2.5", "up2.5"), sep = ", ", remove=T)

给了

df
    est           CI
1  0.05   0.01, 0.09
2 -0.16  -0.2, -0.12
3 -0.02     -0.05, 0
4  0.00  -0.03, 0.04
5 -0.11  -0.2, -0.01
6  0.15     0.1, 0.2
7 -0.26  -0.3, -0.22
8 -0.23 -0.28, -0.17

我想要这个:

    est           CI
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

我相信使用 Base R 执行此操作会很复杂(必须移动/重新排列许多组合列并删除旧列)。有什么办法可以避免unite 去掉零值的小数?

【问题讨论】:

  • formatsprintf 在你之前 unite?

标签: r tidyr


【解决方案1】:

这行得通:

library(tidyverse)

df %>% 
  mutate_if(is.numeric, ~format(., nsmall = 2)) %>% 
  unite("CI", c("low2.5", "up2.5"), sep = ", ", remove=T)
#    est           CI
#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

【讨论】:

  • 问题已解决,即使新列中的文本对齐良好!非常感谢。
猜你喜欢
  • 2016-09-29
  • 2016-06-30
  • 2019-03-13
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多