R звездочет: разные десятичные знаки

У меня проблема с выводом моего звездочета в R.

Вот мой исходный фрейм данных:

Rank  p     LMax   10%   5%  1%   
var1  0.427  24.25 21.8 27.4 31.5
var2  0.228  7.23  11.5 12.2 16.7

Что создает звездочет:

звездочет (данные_сводка, сводка = ЛОЖЬ, цифры = 3)

Rank  p      LMax   10%    5%     1%   
var1  0.427  24.250 21.800 27.400 31.500
var2  0.248  7.230  11.500 12.200 16.700

Важно сохранить три цифры для p, но оставить две цифры для остальных. digits = 2 не решает проблему, так как p тогда состоит только из двух цифр.

Желаемый результат:

Rank  p      LMax   10%    5%     1%   
var1  0.427  24.25 21.80 27.40 31.50
var2  0.248  7.23  11.50 12.20 16.70

Есть идеи, как это решить?


person RPacker    schedule 13.10.2016    source источник
comment
Если столбцы числовые, вы можете использовать: dat[3:5] <- round(dat[3:5], 2)   -  person Rentrop    schedule 13.10.2016
comment
Я знаю, что могу манипулировать фреймом данных, но каким-то образом звездочет может применить только одну десятичную структуру ко всем значениям? Я бы хотел, чтобы он просто распечатал фрейм данных, как есть.   -  person RPacker    schedule 13.10.2016
comment
Если вы хотите, чтобы исходный фрейм данных печатался как есть, почему бы просто не использовать digits=NA? Согласно руководству звездочета, при этом следует полностью отказаться от округления. Я полагаю, что полное исключение аргумента о цифрах может привести к тому же результату.   -  person Olli J    schedule 13.10.2016
comment
@OlliJ, видел это, но он отвечает Ошибка при вставке (first.part, .format.decimal.character, decimal.part, sep =): объект 'decimal.part' не найден   -  person RPacker    schedule 13.10.2016
comment
Тот же вопрос здесь!   -  person RPacker    schedule 16.10.2016


Ответы (1)


Хакерское решение - преобразовать ваш фрейм данных в символьные векторы, каждый из которых имеет соответствующее количество десятичных знаков.

data_summary <- read.table(text = "
Rank  p     LMax   p10   p5  p1   
var1  0.427  24.25 21.8 27.4 31.5
var2  0.228  7.23  11.5 12.2 16.7", header = TRUE, stringsAsFactors = FALSE)

Мы пишем анонимную функцию, которая, учитывая целое число x (количество десятичных знаков) и числовой вектор y, возвращает вектор символов:

out <- mapply(function(x, y) sprintf(sprintf("%%.0%if", y), x), 
  data_summary[-1],
  c(3, 2, 2, 2, 2))
#      p       LMax    p10     p5      p1     
# [1,] "0.427" "24.25" "21.80" "27.40" "31.50"
# [2,] "0.228" "7.23"  "11.50" "12.20" "16.70"

Свяжите значения с метками строк:

data_summary_out <- as.data.frame(cbind(data_summary[, 1], out))
data_summary_out <- setNames(data_summary_out, names(data_summary))

stargazer теперь дает желаемый результат:

library(stargazer)
stargazer(data_summary_out,
          type = "text",
          summary = FALSE,
          digits = NA)
# ====================================
#   Rank   p   LMax   p10   p5    p1  
# ------------------------------------
# 1 var1 0.427 24.25 21.80 27.40 31.50
# 2 var2 0.228 7.23  11.50 12.20 16.70
# ------------------------------------
person Weihuang Wong    schedule 20.04.2019
comment
Как вы перешли с out на data_summary_out? Я предполагаю bind_cols()? Спасибо за все это решение, кстати, это здорово. - person Jeremy K.; 21.08.2019
comment
потому что когда я использую bind_cols (), я получаю сообщение об ошибке Argument 2 must have names. Я пытаюсь скопировать имена с out на data_summary, но у меня проблемы - person Jeremy K.; 21.08.2019
comment
Я пропустил пару шагов в своем ответе. См. Правки. - person Weihuang Wong; 21.08.2019