Відповіді:
Оскільки (досі) ніхто не отримав галочку, я припускаю, що ви маєте на увазі певну практичну проблему, здебільшого тому, що ви не вказали, в який тип вектора ви хочете конвертувати numeric
. Я пропоную вам застосувати transform
функцію, щоб виконати своє завдання.
Зараз я збираюся продемонструвати певну "аномалію конверсії":
# create dummy data.frame
d <- data.frame(char = letters[1:5],
fake_char = as.character(1:5),
fac = factor(1:5),
char_fac = factor(letters[1:5]),
num = 1:5, stringsAsFactors = FALSE)
Давайте поглянемо на data.frame
> d
char fake_char fac char_fac num
1 a 1 1 a 1
2 b 2 2 b 2
3 c 3 3 c 3
4 d 4 4 d 4
5 e 5 5 e 5
і давайте бігти:
> sapply(d, mode)
char fake_char fac char_fac num
"character" "character" "numeric" "numeric" "numeric"
> sapply(d, class)
char fake_char fac char_fac num
"character" "character" "factor" "factor" "integer"
Тепер ви, напевно, запитуєте себе "Де аномалія?" Ну, я натрапив на досить своєрідних речі в R, і це не самим плутаючи річ, але це може збити вас з пантелику, особливо якщо ви читаєте це перед прокаткою в ліжко.
Ось так: перші два стовпці є character
. Я навмисно назвав 2 - й один fake_char
. Знайдіть подібність цієї character
змінної з тією, яку створив Дірк у своїй відповіді. Це насправді numerical
перетворений вектор character
. 3 - й і 4 - й стовпець є factor
, і останній з яких є «чисто» numeric
.
Якщо ви використовуєте transform
функцію, ви можете перетворити fake_char
в numeric
саму char
змінну , але не саму змінну.
> transform(d, char = as.numeric(char))
char fake_char fac char_fac num
1 NA 1 1 a 1
2 NA 2 2 b 2
3 NA 3 3 c 3
4 NA 4 4 d 4
5 NA 5 5 e 5
Warning message:
In eval(expr, envir, enclos) : NAs introduced by coercion
але якщо ви зробите те ж саме fake_char
і char_fac
, вам пощастить, і підете без НС:
> transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
char fake_char fac char_fac num
1 a 1 1 1 1
2 b 2 2 2 2
3 c 3 3 3 3
4 d 4 4 4 4
5 e 5 5 5 5
Якщо зберегти трансформуються data.frame
і перевірити , mode
і class
ви отримаєте:
> D <- transform(d, fake_char = as.numeric(fake_char),
char_fac = as.numeric(char_fac))
> sapply(D, mode)
char fake_char fac char_fac num
"character" "numeric" "numeric" "numeric" "numeric"
> sapply(D, class)
char fake_char fac char_fac num
"character" "numeric" "factor" "numeric" "integer"
Отже, висновок такий: Так, ви можете перетворити character
вектор в numeric
один, але лише якщо його елементи "конвертовані" в numeric
. Якщо character
у векторі є лише один елемент, ви отримаєте помилку при спробі перетворення цього вектора в numerical
один.
І лише щоб довести свою думку:
> err <- c(1, "b", 3, 4, "e")
> mode(err)
[1] "character"
> class(err)
[1] "character"
> char <- as.numeric(err)
Warning message:
NAs introduced by coercion
> char
[1] 1 NA 3 4 NA
А тепер, просто для розваги (або практики), спробуйте вгадати результат цих команд:
> fac <- as.factor(err)
> fac
???
> num <- as.numeric(fac)
> num
???
З повагою до Патріка Бернса! =)
Щось мені допомогло: якщо у вас є діапазони змінних для перетворення (або просто більше, ніж один), ви можете використовувати sapply
.
Трохи безглуздо, але просто для прикладу:
data(cars)
cars[, 1:2] <- sapply(cars[, 1:2], as.factor)
Скажіть, що стовпці 3, 6-15 та 37 з вас повинні бути перетворені в числовий, який міг би:
dat[, c(3,6:15,37)] <- sapply(dat[, c(3,6:15,37)], as.numeric)
sapply
виклик as.data.frame()
праворуч, як @Mehrad Mahmoudian запропонував нижче, він спрацює.
якщо x
це ім'я стовпця фрейму даних dat
і x
є фактором типу, використовуйте:
as.numeric(as.character(dat$x))
as.character
дійсно - це те, що я шукав. Інакше конверсія іноді йде не так. Принаймні в моєму випадку.
Error: (list) object cannot be coerced to type 'double'
хоч я був впевнений, що в моєму векторі немає символів / пунктуацій. Потім я спробував, as.numeric(as.character(dat$x))
і це спрацювало. Тепер я не впевнений, чи є мій стовпець насправді лише цілими чи ні!
Незважаючи на те, що ваше запитання суто є числовим числом, є багато перетворень, які важко зрозуміти, починаючи Р. Я постараюся звернутися до методів допомоги. Це питання схоже на це питання .
Перетворення типу може бути болем у R, оскільки (1) фактори не можуть бути перетворені безпосередньо в числові, їх потрібно перетворити спочатку в клас символів; (2) дати - це особливий випадок, з яким зазвичай потрібно розбиратися окремо, і (3) петляння по стовпцях кадру даних може бути складним. На щастя, "підводний" вирішив більшість питань.
Це рішення використовує mutate_each()
для застосування функції до всіх стовпців у кадрі даних. У цьому випадку ми хочемо застосувати type.convert()
функцію, яка перетворює рядки в числові, куди може. Оскільки R любить фактори (не знаю чому), символьні стовпці, які повинні залишатися символами, змінюються на коефіцієнт. Щоб виправити це, mutate_if()
функція використовується для виявлення стовпців, які є факторами, та зміни характеру. Нарешті, я хотів показати, як мастило можна використовувати для зміни часової позначки в класі символів на дату, оскільки це також часто є стимулятором для початківців.
library(tidyverse)
library(lubridate)
# Recreate data that needs converted to numeric, date-time, etc
data_df
#> # A tibble: 5 × 9
#> TIMESTAMP SYMBOL EX PRICE SIZE COND BID BIDSIZ OFR
#> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
#> 1 2012-05-04 09:30:00 BAC T 7.8900 38538 F 7.89 523 7.90
#> 2 2012-05-04 09:30:01 BAC Z 7.8850 288 @ 7.88 61033 7.90
#> 3 2012-05-04 09:30:03 BAC X 7.8900 1000 @ 7.88 1974 7.89
#> 4 2012-05-04 09:30:07 BAC T 7.8900 19052 F 7.88 1058 7.89
#> 5 2012-05-04 09:30:08 BAC Y 7.8900 85053 F 7.88 108101 7.90
# Converting columns to numeric using "tidyverse"
data_df %>%
mutate_all(type.convert) %>%
mutate_if(is.factor, as.character) %>%
mutate(TIMESTAMP = as_datetime(TIMESTAMP, tz = Sys.timezone()))
#> # A tibble: 5 × 9
#> TIMESTAMP SYMBOL EX PRICE SIZE COND BID BIDSIZ OFR
#> <dttm> <chr> <chr> <dbl> <int> <chr> <dbl> <int> <dbl>
#> 1 2012-05-04 09:30:00 BAC T 7.890 38538 F 7.89 523 7.90
#> 2 2012-05-04 09:30:01 BAC Z 7.885 288 @ 7.88 61033 7.90
#> 3 2012-05-04 09:30:03 BAC X 7.890 1000 @ 7.88 1974 7.89
#> 4 2012-05-04 09:30:07 BAC T 7.890 19052 F 7.88 1058 7.89
#> 5 2012-05-04 09:30:08 BAC Y 7.890 85053 F 7.88 108101 7.90
mutate_all(type.convert, as.is=TRUE)
замість mutate_all(type.convert)
, ви можете видалити / уникнути mutate_if(is.factor, as.character)
скорочення команди. as.is
- це аргумент, type.convert()
який вказує, чи слід перетворювати рядки як символи чи як чинники. За замовчуванням as.is=FALSE
в type.convert()
(тобто перетворює рядки в клас факторів замість класу символів).
Тім правильний, а Шейн упущення. Ось додаткові приклади:
R> df <- data.frame(a = as.character(10:15))
R> df <- data.frame(df, num = as.numeric(df$a),
numchr = as.numeric(as.character(df$a)))
R> df
a num numchr
1 10 1 10
2 11 2 11
3 12 3 12
4 13 4 13
5 14 5 14
6 15 6 15
R> summary(df)
a num numchr
10:1 Min. :1.00 Min. :10.0
11:1 1st Qu.:2.25 1st Qu.:11.2
12:1 Median :3.50 Median :12.5
13:1 Mean :3.50 Mean :12.5
14:1 3rd Qu.:4.75 3rd Qu.:13.8
15:1 Max. :6.00 Max. :15.0
R>
Наше data.frame
тепер має підсумок стовпця факторів (підрахунків) та числових підсумків as.numeric()
---, що неправильно, оскільки отримано числові рівні коефіцієнта --- та (правильне) підсумок as.numeric(as.character())
.
За допомогою наступного коду ви можете перетворити всі стовпці кадру даних у числові (X - кадр даних, який ми хочемо перетворити, це стовпці):
as.data.frame(lapply(X, as.numeric))
а для перетворення всієї матриці в числову у вас є два способи: або:
mode(X) <- "numeric"
або:
X <- apply(X, 2, as.numeric)
Крім того, ви можете використовувати data.matrix
функцію для перетворення всього в числове значення, хоча майте на увазі, що фактори можуть не перетворитися правильно, тому безпечніше перетворити все character
спочатку:
X <- sapply(X, as.character)
X <- data.matrix(X)
Зазвичай я використовую цей останній, якщо хочу одночасно перетворити в матричну та числову
Якщо у вас виникли проблеми з:
as.numeric(as.character(dat$x))
Придивіться до десяткових знаків. Якщо вони є "," замість "." (наприклад, "5,3") вищезгадане не працює.
Потенційне рішення:
as.numeric(gsub(",", ".", dat$x))
Я вважаю, що це досить часто в деяких країнах, які не говорять англійською.
Універсальний спосіб використання type.convert()
та rapply()
:
convert_types <- function(x) {
stopifnot(is.list(x))
x[] <- rapply(x, utils::type.convert, classes = "character",
how = "replace", as.is = TRUE)
return(x)
}
d <- data.frame(char = letters[1:5],
fake_char = as.character(1:5),
fac = factor(1:5),
char_fac = factor(letters[1:5]),
num = 1:5, stringsAsFactors = FALSE)
sapply(d, class)
#> char fake_char fac char_fac num
#> "character" "character" "factor" "factor" "integer"
sapply(convert_types(d), class)
#> char fake_char fac char_fac num
#> "character" "integer" "factor" "factor" "integer"
as.is = TRUE
якщо ви хочете перетворити свого персонажа в числовий чи коефіцієнт
matrix
чисельних змін, classes=matrix
помилився перший аргумент, повинен мати режим режиму
Щоб перетворити стовпець кадру даних у числовий, вам потрібно зробити:
коефіцієнт до числового: -
data_frame$column <- as.numeric(as.character(data_frame$column))
sapply(data_frame,function(x) as.numeric(as.character(x)))
Хоча інші досить добре висвітлювали цю тему, я хотів би додати цю додаткову швидку думку / підказку. Ви можете використовувати regexp, щоб заздалегідь перевірити, чи символи потенційно складаються лише з чисел.
for(i in seq_along(names(df)){
potential_numcol[i] <- all(!grepl("[a-zA-Z]",d[,i]))
}
# and now just convert only the numeric ones
d <- sapply(d[,potential_numcol],as.numeric)
Більш досконалі регулярні вирази та чітке питання, чому вчитися та відчувати їхню силу, дивіться на цьому дійсно приємному веб-сайті: http://regexr.com/
Зважаючи на те, що можуть існувати стовпчики char, це засновано на @Abdou у розділі Отримати типи стовпців листа Excel автоматично відповідати:
makenumcols<-function(df){
df<-as.data.frame(df)
df[] <- lapply(df, as.character)
cond <- apply(df, 2, function(x) {
x <- x[!is.na(x)]
all(suppressWarnings(!is.na(as.numeric(x))))
})
numeric_cols <- names(df)[cond]
df[,numeric_cols] <- sapply(df[,numeric_cols], as.numeric)
return(df)
}
df<-makenumcols(df)
Якщо в кадрі даних є кілька типів стовпців, деякі символи, деякі цифри, спробуйте наступне, щоб перетворити лише стовпці, що містять числові значення, в числові:
for (i in 1:length(data[1,])){
if(length(as.numeric(data[,i][!is.na(data[,i])])[!is.na(as.numeric(data[,i][!is.na(data[,i])]))])==0){}
else {
data[,i]<-as.numeric(data[,i])
}
}
з hablar :: конвертувати
Ви можете легко перетворити кілька стовпців у різні типи даних hablar::convert
. Простий синтаксис: df %>% convert(num(a))
перетворює стовпчик a з df в числовий.
Детальний приклад
Дозволяє конвертувати всі стовпці mtcars
в символ.
df <- mtcars %>% mutate_all(as.character) %>% as_tibble()
> df
# A tibble: 32 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr> <chr>
1 21 6 160 110 3.9 2.62 16.46 0 1 4 4
2 21 6 160 110 3.9 2.875 17.02 0 1 4 4
3 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
З hablar::convert
:
library(hablar)
# Convert columns to integer, numeric and factor
df %>%
convert(int(cyl, vs),
num(disp:wt),
fct(gear))
призводить до:
# A tibble: 32 x 11
mpg cyl disp hp drat wt qsec vs am gear carb
<chr> <int> <dbl> <dbl> <dbl> <dbl> <chr> <int> <chr> <fct> <chr>
1 21 6 160 110 3.9 2.62 16.46 0 1 4 4
2 21 6 160 110 3.9 2.88 17.02 0 1 4 4
3 22.8 4 108 93 3.85 2.32 18.61 1 1 4 1
4 21.4 6 258 110 3.08 3.22 19.44 1 0 3 1
Для перетворення символу в числовий ви повинні перетворити його у коефіцієнт, застосувавши
BankFinal1 <- transform(BankLoan, LoanApproval=as.factor(LoanApproval))
BankFinal1 <- transform(BankFinal1, LoanApp=as.factor(LoanApproval))
Ви повинні зробити два стовпці з однаковими даними, оскільки один стовпець не може перетворитись у числовий. Якщо ви робите одну конверсію, це дає помилку нижче
transform(BankData, LoanApp=as.numeric(LoanApproval))
Warning message: In eval(substitute(list(...)), `_data`, parent.frame()) : NAs introduced by coercion
тож після виконання двох стовпців однакових даних застосовується
BankFinal1 <- transform(BankFinal1, LoanApp = as.numeric(LoanApp),
LoanApproval = as.numeric(LoanApproval))
це перетворить персонаж в числовий успішно
df
ist ваш кадр даних. x
це стовпець, який df
ви хочете конвертувати
as.numeric(factor(df$x))
Якщо ви не дбаєте про збереження факторів і хочете застосувати його до будь-якого стовпця, який може бути перетворений на числовий, я використав сценарій нижче. якщо df - ваш оригінальний кадр даних, ви можете використовувати скрипт, наведений нижче.
df[] <- lapply(df, as.character)
df <- data.frame(lapply(df, function(x) ifelse(!is.na(as.numeric(x)), as.numeric(x), x)))