Вопрос не включал данные, поэтому мы не знаем точно, в чем именно проблема (пожалуйста, всегда предоставьте полный минимальный воспроизводимый пример), но мы разделили ответ на два раздела, основанные на двух возможностях для решения этой проблемы.быть и предоставили данные испытаний для каждого.Пакеты не используются.
Только для округления чисел
Если проблема в том, что у вас есть сочетание чисел и символов, и вы хотите только округлить число, то есть несколько способов.
1) Вычислить, какие столбцы являются числовыми, давая логический вектор ok
, а затем округлить их.Мы используем встроенный набор данных Пуромицин в качестве примера.Пакеты не используются.
ok <- sapply(Puromycin, is.numeric)
replace(Puromycin, ok, round(Puromycin[ok], 1))
, давая:
conc rate state
1 0.0 76 treated
2 0.0 47 treated
3 0.1 97 treated
4 0.1 107 treated
5 0.1 123 treated
6 0.1 139 treated
...etc...
1a) Последняя строка также может быть написана так, если вы не возражаете перезаписать ввод.
Puromycin[ok] <- round(Puromycin[ok], 1)
2) Другой подход заключается в выполнении условия в lapply
Round <- function(x, k) if (is.numeric(x)) round(x, k) else x
replace(Puromycin, TRUE, lapply(Puromycin, Round, 1))
2a) или с перезаписью:
Puromycin[] <- lapply(Puromycin, Round, 1)
Округлить все
Если проблема заключается в том, что все столбцы должны быть числовыми, но некоторые из них на самом деле являются символьными, хотя они представляют собой числа, тогда, используя указанный кадр данных в качестве примера, применитеtype.convert
.
# create test data having numeric, character and factor columns but
# all intended to represent numbers
DF <- structure(list(Time = c("0.1", "0.12", "0.3", "0.14", "0.5",
"0.7"), demand = c(0.83, 1.03, 1.9, 1.6, 1.56, 1.98), Time2 = structure(c(1L,
2L, 4L, 3L, 5L, 6L), .Label = c("0.1", "0.12", "0.14", "0.3",
"0.5", "0.7"), class = "factor")), class = "data.frame", row.names = c(NA,
-6L))
round(replace(DF, TRUE, lapply(DF, type.convert)), 1)