Как округлить data.frame в R, который содержит некоторые символьные переменные?

У меня есть фрейм данных, и я хочу округлить все числа (готов к экспорту). Это должно быть просто, но у меня проблемы, потому что некоторые биты фрейма данных не являются числовыми числами. Например, в приведенном ниже примере я хочу округлить цифры до ближайшего целого числа:

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) ), но я хочу округлить всю таблицу, содержащую некоторые столбцы, не являющиеся числовыми.

29
задан Jeromy Anglim 22 September 2016 в 03:34
поделиться

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)
45
ответ дан 28 November 2019 в 00:34
поделиться

Другие ответы не совсем отвечают на вопрос ОП точно потому, что они предполагают, что данные примера отличаются от того, что предоставил ОП.

Если мы читаем вопрос буквально, и мы хотим общее решение, которое найдет столбцы с цифрами в них (любого векторного типа), преобразует их в числовые, а затем выполняет другую числовую операцию, такую ​​как округление. Мы можем использовать 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

Это может будет полезен в случае кадра данных с большим количеством столбцов, и когда у нас есть много столбцов типа символ / фактор, заполненных цифрами, которые мы хотим использовать в качестве числовых, но это слишком утомительно, чтобы делать это вручную.

4
ответ дан 28 November 2019 в 00:34
поделиться
Другие вопросы по тегам:

Похожие вопросы: