Pozostałe odpowiedzi nie odpowiadają na pytanie PO dokładnie dlatego, że zakładają, że dane przykładowe różnią się od podanych w PO.
Jeśli odczytamy pytanie dosłownie i chcemy ogólnego rozwiązania, które znajdzie kolumny z cyframi (dowolnego typu wektorowego), skonwertuj je na numeryczne, a następnie wykonaj inną operację numeryczną, taką jak zaokrąglenie.Możemy użyć purrr:dmap
i zrobić to tak:
Oto dane dostarczone przez PO, gdzie wszystkie cols są czynnikami (irytujące domyślne, ale można sobie z tym poradzić):
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
We ll szukać przełęcze z cyfr w nich i dokonać dataframe indeksów oznaczyć numeryczne:
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
Wtedy możemy wykorzystać te indeksy, aby wybrać podzbiór przełęcze w oryginalnym dataframe i konwertować je do numeryczna, i rób także inne rzeczy (w tym przypadku zaokrąglanie):
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))
I mamy pożądany rezultat:
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
To może być przydatna w przypadku dataframe z dużą liczbą kolumn, a gdzie mamy wiele typu cols charakter/czynnika pełne cyfry, które chcemy mieć jako cyfry, ale zbyt męczące, by robić to ręcznie.
Zaokrąglanie ma sens w przypadku "liczb", a nie znaków. Musisz przekonwertować 'Value1' i' Value2' jako 'numeric', np. 'round (jako numeryczne (Value1), 0)' zrobiłoby to zadanie, ale nie określiłeś w jaki sposób powinno być wykonane zaokrąglanie (wyszukaj '' trunc', 'ceiling' lub' floor'). – chl