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