我正在使用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
有什么问题吗?
答案 0 :(得分:2)
使用7
,然后将小数点转换为逗号:
10
给予:
sprintf
或用dplyr编写此代码:
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
答案 1 :(得分:1)
在这种情况下,mapply
更适合您:
df$b <- mapply(format44, df$a)
您甚至不需要format44
包装器。您可以使用:
df$c <- mapply(format, df$a, 4,4)