r - R在数据框R上应用自制格式化功能
问题描述
我正在使用 R,我需要在数据帧中格式化数字,特别是通过在小数点分隔符之前和之后强加位数。例如3.56
必须成为"0003,56000"
.
所以我建立了自己的功能:
format <- function(x, nbr_before_comma, nbr_after_comma){
x= round(x, nbr_after_comma)
x = toString(x)
l = strsplit(x, "[.]")[[1]]
#print(l)
#print(nchar(l[2]))
before_comma = paste0(strrep("0",nbr_before_comma - nchar(l[1])),l[1])
after_comma = ifelse(length(l) > 1,
paste0(l[2],strrep("0",nbr_after_comma - nchar(l[2]))),
strrep("0", nbre_after_comma))
res = paste0(before_comma, ",", after_comma)
return(res)
}
在单个号码上尝试此操作将起作用。现在我正在尝试将其应用于数据框。让我们以玩具为例:
df <- data.frame("a" = c(2.5,3.56,4.5))
我更精确地定义了我想要的:
format44 <- function(x){
return(format(x,4,4))
}
我尝试了几种可能性:
df[] <- lapply(df, format44)
与dplyr
:
df <- df %>%
mutate(a = format44(a))
最后:
df["a"] <- lapply(df["a"],format44)
没有一个会起作用。实际上,我每次都得到相同的输出:
a
1 0002,5, 3
2 0002,5, 3
3 0002,5, 3
知道问题是什么吗?
解决方案
使用sprintf
然后将小数点转换为逗号:
before <- after <- 4
fmt <- sprintf("%%0%d.%df", before + after + 1, after)
transform(df, a = chartr(".", ",", sprintf(fmt, a)))
给予:
a
1 0002,5000
2 0003,5600
3 0004,5000
或者用 dplyr 写这个:
library(dplyr)
before <- after <- 4
df %>%
mutate(a = "%%0%d.%df" %>%
sprintf(before + after + 1, after) %>%
sprintf(a) %>%
chartr(".", ",", .))
给予:
a
1 0002,5000
2 0003,5600
3 0004,5000
推荐阅读
- azure - 逻辑应用 HTTP 失败 - 您无权执行此操作
- java - 如何在测试方法中读取 Junit 配置(ex.tag)
- python - PyTorch RuntimeError:mat1 和 mat2 形状不能相乘
- ethereum - 区块链教程错误:必须定义发送交易“来自”字段
- mysql - 从两个表中获取数据并忽略 laravel 中的重复值
- javascript - 有什么方法可以在同一行创建具有多个范围的条形图?
- open-policy-agent - Conftest 验证夹具数据
- java - VS Code 运行 .java 文件而不产生 .class 文件
- python - 如果文件未向公众开放,则从网站上下载的 Python 3 Mechanizesoup 文件损坏
- javascript - 基于 foreach 循环索引的动态数组名称 forEach((key) => { const temp[{ key }] }