У меня есть фрейм данных, и я хочу округлить все числа (готов к экспорту). Это должно быть просто, но у меня проблемы, потому что некоторые биты фрейма данных не являются числовыми числами. Например, в приведенном ниже примере я хочу округлить цифры до ближайшего целого числа:
ID = c("a","b","c","d","e")
Value1 = c("3.4","6.4","8.7","1.1","0.1")
Value2 = c("8.2","1.7","6.4","1.9","10.3")
df<-data.frame(ID,Value1,Value2)
Кто-нибудь может мне помочь? Я могу округлить отдельные столбцы (например, round (df $ Value1, 2)
), но я хочу округлить всю таблицу, содержащую некоторые столбцы, не являющиеся числовыми.
Признавая, что это старый вопрос, и один ответ принят, я хотел бы предложить другое решение, так как этот вопрос отображается в Google как один из лучших.
Более общее решение заключается в создании отдельной функции, которая ищет все числовые переменные и округляет их до указанного числа цифр:
round_df <- function(df, digits) {
nums <- vapply(df, is.numeric, FUN.VALUE = logical(1))
df[,nums] <- round(df[,nums], digits = digits)
(df)
}
После определения можно использовать это следующим образом:
> round_df(df, digits=3)
Другие ответы не совсем отвечают на вопрос ОП точно потому, что они предполагают, что данные примера отличаются от того, что предоставил ОП.
Если мы читаем вопрос буквально, и мы хотим общее решение, которое найдет столбцы с цифрами в них (любого векторного типа), преобразует их в числовые, а затем выполняет другую числовую операцию, такую как округление. Мы можем использовать purrr:dmap
и сделать это следующим образом:
Вот данные, представленные OP, где все столбцы являются факторами (раздражающее значение по умолчанию, но мы можем с этим справиться):
ID = c("a","b","c","d","e")
Value1 = c("3.4","6.4","8.7","1.1","0.1")
Value2 = c("8.2","1.7","6.4","1.9","10.3")
df<-data.frame(ID,Value1,Value2)
str(df)
'data.frame': 5 obs. of 3 variables:
$ ID : Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
$ Value1: Factor w/ 5 levels "0.1","1.1","3.4",..: 3 4 5 2 1
$ Value2: Factor w/ 5 levels "1.7","1.9","10.3",..: 5 1 4 2 3
Мы будем искать столбцы с цифрами в них и составлять таблицу данных индексов для обозначения чисел:
library(dplyr)
library(purrr)
df_logical <-
df %>%
dmap(function(i) grepl("[0-9]", i))
df_logical
ID Value1 Value2
1 FALSE TRUE TRUE
2 FALSE TRUE TRUE
3 FALSE TRUE TRUE
4 FALSE TRUE TRUE
5 FALSE TRUE TRUE
str(df_logical)
'data.frame': 5 obs. of 3 variables:
$ ID : logi FALSE FALSE FALSE FALSE FALSE
$ Value1: logi TRUE TRUE TRUE TRUE TRUE
$ Value2: logi TRUE TRUE TRUE TRUE TRUE
Затем мы можем использовать эти индексы для выбора подмножества столбцов в исходный кадр данных и преобразовать их в числовые, а также выполнять другие действия (в данном случае, округление):
df_numerics <-
map(1:ncol(df), function(i) ifelse(df_logical[,i],
as.numeric(as.character(df[,i])),
df[,i])) %>%
dmap(round, 0) %>%
setNames(names(df))
И мы получили желаемый результат:
df_numerics
ID Value1 Value2
1 1 3 8
2 2 6 2
3 3 9 6
4 4 1 2
5 5 0 10
str(df_numerics)
'data.frame': 5 obs. of 3 variables:
$ ID : num 1 2 3 4 5
$ Value1: num 3 6 9 1 0
$ Value2: num 8 2 6 2 10
Это может будет полезен в случае кадра данных с большим количеством столбцов, и когда у нас есть много столбцов типа символ / фактор, заполненных цифрами, которые мы хотим использовать в качестве числовых, но это слишком утомительно, чтобы делать это вручную.