Я пытаюсь округлить все числовые значения в своем фрейме данных.
Проблема в том, что мой фрейм данных также включает строки, а не только в какой-либо конкретный столбец или строку. Я хочу избежать необходимости кодировать цикл, в котором я просматриваю каждую отдельную пару ячеек строки-столбца и проверяю, является ли значение числовым перед округлением.
Есть ли функция (или комбинация функций), которая позволит мне добиться этого?
До сих пор я пробовал round_df()
и различные комбинации lapply()
и apply()
с лямбда-выражениями. Однако я получил только то, где он округляется на основе первого значения в столбце (т.е. если первое значение является числовым, он рассматривает весь столбец как числовой и только округляет его).
Я столкнулся с проблемами тогда, когда первое значение является строкой, и поэтому весь столбец не округляется или наоборот, в которых мой код ошибается, потому что он пытается округлить строку.
Моя функция:
library(readxl)
library(knitr)
library(gplots)
library(doBy)
library(dplyr)
library(plyr)
library(printr)
library(xtable)
library(gmodels)
library(survival)
library(pander)
library(psych)
library(questionr)
library(DT)
library(data.table)
library(expss)
library(xtable)
options(xtable.floating = FALSE)
options(xtable.timestamp = "")
library(kableExtra)
library(magrittr)
library(Hmisc)
library(forestmangr)
library(summarytools)
library(gmodels)
library(stats)
summaryTable <- function(y, bygroup, digit,
title="", caption_heading="", caption="", freq.tab, y.label="",
y.names="", boxplot) {
if (freq.tab) {
m = multi.fun(y)
}
else if (!missing(bygroup)) {
m = data.frame(y.label = "")
m = merge(m, data.frame(describeBy(y, bygroup, mat = T)))
m = select(m, y.label, n, mean, sd, min, median, max)
}
else {
m = data.frame(y.label = "")
m = merge(m, data.frame(sumconti(y)))
}
if (!freq.tab) {
m$y.label = y.names
}
m = round_df(m, digit, "signif")
if (freq.tab) {
colnames(m) = c(y.label, "Frequency", "%")
}
else if (missing(freq.tab) | !freq.tab) {
colnames(m) = c(y.label, "n", "Mean", "Std", "Min", "Median", "Max")
}
if (!missing(boxplot)) {
if (boxplot) {
attach(m)
layout(matrix(c(1, 1, 2, 1)), 2, 1)
kable(m, align = "c", "latex", booktabs = T, caption=figTitle(x, title, y.label)) %>%
kable_styling(position = 'center',
latex_options = c("striped", "repeat_header", "hold_position")) %>%
footnote(general = caption, general_title = caption_heading, footnote_as_chunk = T,
title_format = c("italic", "underline"), threeparttable = T)
boxplot(y ~ bygroup, main = figTitle(y, title, y.label), names = y.names, ylab = title,
xlab = y.label, col = c("red", "blue", "orange", "pink",
"green", "purple", "grey", "yellow"), border = "black",
horizontal = F, varwidth = T)
}
}
kable(m,
align = "c",
"latex",
booktabs = T,
caption = figTitle(x, title, y.label)) %>%
kable_styling(position = 'center',
latex_options = c("striped", "repeat_header", "hold_position")) %>%
footnote(general = caption,
general_title = caption_heading,
footnote_as_chunk = T,
title_format = c("italic", "underline"),
threeparttable = T)
}
figTitle = function(x, title, y.label) {
if (y.label != "") {
paste("Summary of", title, "by", y.label)
}
else if (title != "") {
paste("Summary of", title)
}
else {
paste("")
}
}
str(head(your_dataframe))
, нам нужно точно увидеть, какие типы у вас есть для ваших столбцов. Столбцы в фреймах данных (обычно) имеют только один тип, поэтому, если первое значение является строкой, остальная часть столбца будет строкой. - person Marius   schedule 20.06.2019dplyr::mutate_if(df, is.numeric, round)
- person Shree   schedule 20.06.2019rapply(your_data, f = round, classes = "numeric", how = "replace")
- person markus   schedule 20.06.2019mutate_if
заменено, говорит помощь. Теперь они используютmutate(df, across(where(is.numeric), round))
- person MartineJ   schedule 23.05.2021