Другие ответы не совсем отвечают на вопрос ОП именно потому, что они предполагают, что данные примера отличаются от того, что предоставил ОП.
Если мы читаем вопрос буквально, и мы хотим получить общее решение, в котором будут найдены столбцы с цифрами в них (любого векторного типа), преобразовать их в числовые и затем выполнить другую числовую операцию, такую как округление.Мы можем использовать purrr:dmap
и сделать это так:
Вот данные, как это предусмотрено ОП, где все перевалы являются факторами (раздражающий по умолчанию, но мы можем иметь дело с этим):
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
Мы» будет искать перевалы с цифрами в них, и сделать dataframe индексов для обозначения цифр:
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
Тогда мы можем использовать эти показатели, чтобы выбрать подмножество перевалов в оригинальной dataframe и конвертировать их в цифровой, и делать другие вещи (в данном случае округление):
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
Это может быть полезно в случае dataframe с большим количеством столбцов, и где у нас есть много COLS символьного типа/фактора полный цифр, которые мы хотим как числовые, но это слишком утомительно делать вручную.
Округление имеет смысл для «чисел», а не символов. Вам придется преобразовать 'Value1' и' Value2' как 'numeric', например. 'round (as.numeric (Value1), 0)' выполнит задание, но вы не указали, как должно выполняться округление (поиск одного из 'trunc',' ceiling' или 'floor'). – chl