如何强制 R 中的 Hmisc 包四舍五入到 3 位小数?
How to force Hmisc package in R to round to 3 decimals?
我有一个使用 Hmisc
包生成的相关矩阵。它产生 2 位小数的相关性,但我希望它显示 3 位小数。我如何强制它这样做?我正在使用 rcorr
函数。
数据:
df <- structure(list(X1 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
X2 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0), Y1 = c(3.93333333333333, 3.13333333333333, 4.3, 4.13333333333333,
3.2, 3.6, 3.66666666666667, 1.8, 3.8, 4.13333333333333, 4.13333333333333,
1.6, 3.4, 3.26666666666667, 2.53333333333333, 4.06666666666667,
4.53333333333333, 4.13333333333333, 3.4, 3.8, 3.33333333333333,
3.86666666666667, 4, 4.2, 2.53333333333333, 1.73333333333333,
1.8, 2.73333333333333, 1.66666666666667, 1.33333333333333,
2, 2.4, 3, 3.26666666666667, 3.2, 3.53333333333333, 3.66666666666667,
2.8, 3.33333333333333, 3.06666666666667, 3.46666666666667,
3.13333333333333, 3.93333333333333, 2.46666666666667, 1.26666666666667,
4.13333333333333, 1.8, 3, 2.93333333333333, 1.53333333333333,
4.06666666666667, 3.6, 2.06666666666667, 4.13333333333333,
3.3, 3.53333333333333, 3.4, 3.93333333333333, 3.73333333333333,
3, 3.13333333333333, 2.2, 4, 5, 3.66666666666667, 3.2, 3.4,
3.8, 3.66666666666667, 4.3, 4.2, 4.46666666666667, 3.33333333333333,
4.4, 4.2), Y2 = c(3.6, 2.2, 3.5, 4.2, 3, 2.8, 5, 2, 4.8,
4.4, 4.6, 1.6, 3.8, 3, 3, 3.4, 3.8, 4.2, 3.4, 3.4, 3.4, 4,
4.8, 4, 2.8, 1, 1.4, 1.2, 1.6, 3.8, 2.2, 1.4, 3.2, 1, 3.4,
3.2, 3.4, 1.8, 3.2, 1, 3, 2.8, 2.4, 1, 1, 4, 1.8, 2, 1, 1.2,
4.4, 3.2, 2, 4.2, 3.2, 3.2, 3.2, 3.6, 2.2, 2.8, 3.4, 2.6,
3.8, 4.2, 2.8, 3, 3.2, 4.8, 4.8, 4, 5, 5, 4.2, 4.6, 4.5)), row.names = c(NA,
-75L), groups = structure(list(filter = c(0, 1, 2), .rows = list(
1:25, 26:50, 51:75)), row.names = c(NA, -3L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
correlation.matrix <- as.matrix(df[, c(
"X1", "X2", "Y1", "Y2")])
cor.table <- Hmisc::rcorr(correlation.matrix)
cor.table
使用print
函数,您可以指定所需的位数。
print( cor.table$r, digits=3)
我认为你不能(母语)。
来自 source code of Hmisc:::print.rcorr
(未导出但用作 S3 方法):
P <- ifelse(P < .0001, 0, P)
p <- format(round(P, 4))
函数硬编码用 0 和打印中的 4 位数字替换低值。我建议您打开一个带有功能请求的 issue。
同时,这里有一个可以让您稍微控制它的替代品:
print.rcorr <- function(x, ..., digits = getOption("Hmisc.rcorr.digits", 4))
{
print(round(x$r,2))
n <- x$n
if(all(n == n[1,1]))
cat("\nn=", n[1,1], "\n\n")
else {
cat("\nn\n")
print(n)
}
cat("\nP\n")
P <- x$P
P <- ifelse(P < .0001, 0, P)
p <- format(round(P, digits))
p[is.na(P)] <- ""
print(p, quote=FALSE)
invisible()
}
print(cor.table, digits=2)
# X1 X2 Y1 Y2
# X1 1.00 -0.50 0.31 0.34
# X2 -0.50 1.00 -0.50 -0.61
# Y1 0.31 -0.50 1.00 0.74
# Y2 0.34 -0.61 0.74 1.00
# n= 75
# P
# X1 X2 Y1 Y2
# X1 0.00 0.01 0.00
# X2 0.00 0.00 0.00
# Y1 0.01 0.00 0.00
# Y2 0.00 0.00 0.00
这个 "should" 总是屏蔽 Hmisc:::print.rcorr
。我添加了使用 options
控制器的功能,因此您甚至可以
options("Hmisc.rcorr.digits" = 2)
cor.table
# X1 X2 Y1 Y2
# X1 1.00 -0.50 0.31 0.34
# X2 -0.50 1.00 -0.50 -0.61
# Y1 0.31 -0.50 1.00 0.74
# Y2 0.34 -0.61 0.74 1.00
# n= 75
# P
# X1 X2 Y1 Y2
# X1 0.00 0.01 0.00
# X2 0.00 0.00 0.00
# Y1 0.01 0.00 0.00
# Y2 0.00 0.00 0.00
但是,请注意两句:
- 虽然我没有测试好并且我认为它足够强大,但某些加载包的方法可能会使用
Hmisc:::print.rcorr
而不是你的全局定义版本......我会有稍微考虑一下名称空间和搜索路径,以了解这是否会无意中发生;和
- if/when
Hmisc
更新了他们的功能,你应该也更新这个功能。虽然这不太可能(该功能的最后更新是 6 years ago),但它肯定是可行的。
我有一个使用 Hmisc
包生成的相关矩阵。它产生 2 位小数的相关性,但我希望它显示 3 位小数。我如何强制它这样做?我正在使用 rcorr
函数。
数据:
df <- structure(list(X1 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1),
X2 = c(0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0), Y1 = c(3.93333333333333, 3.13333333333333, 4.3, 4.13333333333333,
3.2, 3.6, 3.66666666666667, 1.8, 3.8, 4.13333333333333, 4.13333333333333,
1.6, 3.4, 3.26666666666667, 2.53333333333333, 4.06666666666667,
4.53333333333333, 4.13333333333333, 3.4, 3.8, 3.33333333333333,
3.86666666666667, 4, 4.2, 2.53333333333333, 1.73333333333333,
1.8, 2.73333333333333, 1.66666666666667, 1.33333333333333,
2, 2.4, 3, 3.26666666666667, 3.2, 3.53333333333333, 3.66666666666667,
2.8, 3.33333333333333, 3.06666666666667, 3.46666666666667,
3.13333333333333, 3.93333333333333, 2.46666666666667, 1.26666666666667,
4.13333333333333, 1.8, 3, 2.93333333333333, 1.53333333333333,
4.06666666666667, 3.6, 2.06666666666667, 4.13333333333333,
3.3, 3.53333333333333, 3.4, 3.93333333333333, 3.73333333333333,
3, 3.13333333333333, 2.2, 4, 5, 3.66666666666667, 3.2, 3.4,
3.8, 3.66666666666667, 4.3, 4.2, 4.46666666666667, 3.33333333333333,
4.4, 4.2), Y2 = c(3.6, 2.2, 3.5, 4.2, 3, 2.8, 5, 2, 4.8,
4.4, 4.6, 1.6, 3.8, 3, 3, 3.4, 3.8, 4.2, 3.4, 3.4, 3.4, 4,
4.8, 4, 2.8, 1, 1.4, 1.2, 1.6, 3.8, 2.2, 1.4, 3.2, 1, 3.4,
3.2, 3.4, 1.8, 3.2, 1, 3, 2.8, 2.4, 1, 1, 4, 1.8, 2, 1, 1.2,
4.4, 3.2, 2, 4.2, 3.2, 3.2, 3.2, 3.6, 2.2, 2.8, 3.4, 2.6,
3.8, 4.2, 2.8, 3, 3.2, 4.8, 4.8, 4, 5, 5, 4.2, 4.6, 4.5)), row.names = c(NA,
-75L), groups = structure(list(filter = c(0, 1, 2), .rows = list(
1:25, 26:50, 51:75)), row.names = c(NA, -3L), class = c("tbl_df",
"tbl", "data.frame"), .drop = TRUE), class = c("grouped_df",
"tbl_df", "tbl", "data.frame"))
correlation.matrix <- as.matrix(df[, c(
"X1", "X2", "Y1", "Y2")])
cor.table <- Hmisc::rcorr(correlation.matrix)
cor.table
使用print
函数,您可以指定所需的位数。
print( cor.table$r, digits=3)
我认为你不能(母语)。
来自 source code of Hmisc:::print.rcorr
(未导出但用作 S3 方法):
P <- ifelse(P < .0001, 0, P)
p <- format(round(P, 4))
函数硬编码用 0 和打印中的 4 位数字替换低值。我建议您打开一个带有功能请求的 issue。
同时,这里有一个可以让您稍微控制它的替代品:
print.rcorr <- function(x, ..., digits = getOption("Hmisc.rcorr.digits", 4))
{
print(round(x$r,2))
n <- x$n
if(all(n == n[1,1]))
cat("\nn=", n[1,1], "\n\n")
else {
cat("\nn\n")
print(n)
}
cat("\nP\n")
P <- x$P
P <- ifelse(P < .0001, 0, P)
p <- format(round(P, digits))
p[is.na(P)] <- ""
print(p, quote=FALSE)
invisible()
}
print(cor.table, digits=2)
# X1 X2 Y1 Y2
# X1 1.00 -0.50 0.31 0.34
# X2 -0.50 1.00 -0.50 -0.61
# Y1 0.31 -0.50 1.00 0.74
# Y2 0.34 -0.61 0.74 1.00
# n= 75
# P
# X1 X2 Y1 Y2
# X1 0.00 0.01 0.00
# X2 0.00 0.00 0.00
# Y1 0.01 0.00 0.00
# Y2 0.00 0.00 0.00
这个 "should" 总是屏蔽 Hmisc:::print.rcorr
。我添加了使用 options
控制器的功能,因此您甚至可以
options("Hmisc.rcorr.digits" = 2)
cor.table
# X1 X2 Y1 Y2
# X1 1.00 -0.50 0.31 0.34
# X2 -0.50 1.00 -0.50 -0.61
# Y1 0.31 -0.50 1.00 0.74
# Y2 0.34 -0.61 0.74 1.00
# n= 75
# P
# X1 X2 Y1 Y2
# X1 0.00 0.01 0.00
# X2 0.00 0.00 0.00
# Y1 0.01 0.00 0.00
# Y2 0.00 0.00 0.00
但是,请注意两句:
- 虽然我没有测试好并且我认为它足够强大,但某些加载包的方法可能会使用
Hmisc:::print.rcorr
而不是你的全局定义版本......我会有稍微考虑一下名称空间和搜索路径,以了解这是否会无意中发生;和 - if/when
Hmisc
更新了他们的功能,你应该也更新这个功能。虽然这不太可能(该功能的最后更新是 6 years ago),但它肯定是可行的。