首页 > 解决方案 > 在R中将数字对象转换为字符对象时如何保留尾随零?

问题描述

下面是我在处理 R 中将数字对象转换为字符对象时遇到的问题的屏幕截图。否则数据框是正确的,但在字符“46”和“104”之后缺少尾随零。

在此处输入图像描述

考虑以下 MWE:

library(dplyr)

# I first created random data and then created quintiles from the data.
# The random data are listed below:
testdata1 <- structure(list(X = c(62.5229689071269, 145.825042620083, 124.871684774549, 
                                86.2501301893607, 101.433010648648, 144.618979893455, 110.778688415318, 
                                45.9851314727384, 106.411772801465, 56.7832887263229, 162.318035050403, 
                                72.8574239442922, 133.416450070424, 137.670510111283, 107.965525693767, 
                                114.545917853894, 103.963829924899, 123.393869519699, 70.6355172309528, 
                                67.4792934191092), quintiles = structure(c(1L, 5L, 4L, 2L, 2L, 
                                5L, 3L, 1L, 3L, 1L, 5L, 2L, 4L, 5L, 3L, 4L, 3L, 4L, 2L, 1L),
                                .Label = c("[46,70]", "(70,103]", "(103,112]", "(112,134]", "(134,162]"),
                                class = "factor")), row.names = c(NA, 20L), class = "data.frame")

# A new dataframe "testdata2" will show in 4 columns:
# 1) quintiles,
# 2) min. value of X in each quintile,
# 3) max. value of X in each quintile, and
# 4) the range between mins and maxs within the quintiles:

testdata2 <- as.data.frame(levels(testdata1$quintiles))
names(testdata2)[1] <- 'Quintiles'

testdata2$Min <- testdata1 %>% group_by(quintiles) %>% summarise(X = min(X)) %>%
  select(X)  %>% mutate(across(where(is.numeric), round, 1)) %>% as.matrix %>% as.character

testdata2$Max <- testdata1 %>% group_by(quintiles) %>% summarise(X = max(X)) %>%
  select(X)  %>% mutate(across(where(is.numeric), round, 1)) %>% as.matrix %>% as.character

testdata2$Range <- format(paste(testdata2$Min, testdata2$Max, sep="-"))

View(testdata2)

作为旁注,我很难避免将整个向量(所有最小值和所有最大值)投影到数据框中的每个单独的单元格。如果你从代码中删除两个 as.matrix 函数,你就会明白我的意思了。有没有比使用 as.matrix 更优雅的方式来实现结果?

任何帮助是极大的赞赏。

标签: rdataframecharacterdecimalrounding

解决方案


与其将字符串粘贴在一起,不如使用sprintf,您可以对格式进行大量控制。

> sprintf("%d.0-%d.0", 71, 100)
[1] "71.0-100.0"

编辑

完整的工作看起来与此类似。

testdata1 %>% 
  group_by(quintiles) %>% 
  mutate(
    Min = min(X),
    Max = max(X),
    Range = sprintf("%.1f-%.1f", Min, Max)
    ) 

sprintf将整理格式和前导 0。感谢罗兰的指正,不知道我在上面做什么


推荐阅读