Как заставить пакет Hmisc в R округлять до 3 десятичных? - PullRequest
0 голосов
/ 22 октября 2019

У меня есть корреляционная матрица, созданная с использованием пакета 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

Ответы [ 2 ]

3 голосов
/ 22 октября 2019

Я думаю, что вы не можете (изначально).

Из исходного кода Hmisc:::print.rcorr (не экспортируется, но используется как метод S3):

  P <- ifelse(P < .0001, 0, P)
  p <- format(round(P, 4))

Жесткие коды функции, заменяющие низкие значения на 0, а также 4 цифры на отпечатке. Я предлагаю вам открыть выпуск с запросом функции.

А пока вот замена, которая позволяет вам немного ее контролировать:

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     

Это«должен» всегда маскировать 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 вместо вашей глобальной определенной версии ... Мне нужно немного подумать о пространствах имен и пути поиска, чтобы узнать, может ли это непреднамеренно произойтислучиться;и
  • , если / когда Hmisc обновляет их функцию, вам, вероятно, следует также обновить эту функцию. Хотя это маловероятно (последнее обновление этой функции было 6 лет назад ), это, безусловно, возможно.
1 голос
/ 22 октября 2019

Используя функцию print, вы можете указать необходимое количество цифр.

print( cor.table$r, digits=3)
...