Измените class с коэффициента на числовое число столбцов в кадре данных
Каков самый быстрый / лучший способ изменить большое количество столбцов на числовые из коэффициента?
Я использовал следующий код, но он, похоже, повторно заказал мои данные.
> head(stats[,1:2]) rk team 1 1 Washington Capitals* 2 2 San Jose Sharks* 3 3 Chicago Blackhawks* 4 4 Phoenix Coyotes* 5 5 New Jersey Devils* 6 6 Vancouver Canucks* for(i in c(1,3:ncol(stats))) { stats[,i] head(stats[,1:2]) rk team 1 2 Washington Capitals* 2 13 San Jose Sharks* 3 24 Chicago Blackhawks* 4 26 Phoenix Coyotes* 5 27 New Jersey Devils* 6 28 Vancouver Canucks*
Каков наилучший способ, не называя каждого столбца, как в:
- Прочтите файл csv в R со столбцом валюты как числовой
- Как преобразовать таблицу в кадр данных
- Интерпретация "имеет длину> 1" предупреждение от функции `if`
- Есть ли способ `source ()` и продолжить после ошибки?
- Есть ли способ сделать R звуковой сигнал / воспроизвести звук в конце скрипта?
df$colname <- as.numeric(ds$colname)
- Найти повторяющиеся значения в R
- Как вы читаете в нескольких файлах .txt в R?
- Суммировать строки в data.frame или matrix
- Какой самый полезный трюк?
- Сплит-кадр данных по уровням фактора и именных кадров данных по этим уровням
- Удалите повторяющиеся пары столбцов, сортируйте строки на основе двух столбцов
- Ограниченная суммарная сумма?
- R создать идентификатор внутри группы
В дополнение к ответу Рамнатха, поведение, которое вы испытываете, состоит в том, что благодаря as.numeric(x)
возвращается внутреннее числовое представление фактора x
на уровне R. Если вы хотите сохранить числа, которые являются уровнями фактора (а не их внутренним представлением), вам нужно сначала преобразовать в символ с помощью as.character()
в соответствии с примером Рамнатха.
Цикл for
так же разумен, как и призыв к приложению, и может быть немного более читабельным относительно того, каково намерение кода. Просто измените эту строку:
stats[,i] <- as.numeric(stats[,i])
читать
stats[,i] <- as.numeric(as.character(stats[,i]))
Это FAQ 7.10 в FAQ по R.
НТН
Вы должны быть осторожны при изменении факторов на числовые. Вот строка кода, которая изменила бы набор столбцов от коэффициента к числовому. Я предполагаю, что столбцы, которые нужно изменить на числовые, равны 1, 3, 4 и 5 соответственно. Вы можете изменить его соответственно
cols = c(1, 3, 4, 5); df[,cols] = apply(df[,cols], 2, function(x) as.numeric(as.character(x)));
Это можно сделать в одной строке, нет необходимости в цикле, будь то for-loop или apply. Вместо этого используйте unlist ():
# testdata Df <- data.frame( x = as.factor(sample(1:5,30,r=TRUE)), y = as.factor(sample(1:5,30,r=TRUE)), z = as.factor(sample(1:5,30,r=TRUE)), w = as.factor(sample(1:5,30,r=TRUE)) ) ## Df[,c("y","w")] <- as.numeric(as.character(unlist(Df[,c("y","w")]))) str(Df)
Изменить: для вашего кода это будет:
id <- c(1,3:ncol(stats))) stats[,id] <- as.numeric(as.character(unlist(stats[,id])))
Очевидно, что если у вас есть одностолбцовый фрейм данных, и вы не хотите, чтобы автоматическое уменьшение размера R для преобразования его в вектор, вам нужно добавить аргумент drop=FALSE
.
Я знаю, что этот вопрос давно разрешен, но у меня недавно была аналогичная проблема, и я думаю, что нашел немного более элегантное и функциональное решение, хотя для этого требуется пакет magrittr.
library(magrittr) cols = c(1, 3, 4, 5) df[,cols] %<>% lapply(function(x) as.numeric(as.character(x)))
%<>%
оператора %<>%
и переназначения, что очень полезно для простой очистки данных и преобразования. Теперь применять функцию списка намного легче, просто указав функцию, которую вы хотите применить.
Я думаю, что ucfagls нашли, почему ваша петля не работает.
Если вы все еще не хотите использовать цикл, то это решение с lapply
:
factorToNumeric <- function(f) as.numeric(levels(f))[as.integer(f)] cols <- c(1, 3:ncol(stats)) stats[cols] <- lapply(stats[cols], factorToNumeric)
Редактировать. Я нашел более простое решение. Кажется, что as.matrix
преобразуется в характер. Так
stats[cols] <- as.numeric(as.matrix(stats[cols]))
должен делать то, что вы хотите.
lapply в значительной степени предназначен для этого
unfactorize<-c("colA","colB") df[,unfactorize]<-lapply(unfactorize, function(x) as.numeric(as.character(df[,x])))
Я нашел эту функцию на пару других повторяющихся streamов и нашел ее элегантный и общий способ решить эту проблему. Этот stream появляется в первую очередь в большинстве запросов по этой теме, поэтому я поделился им здесь, чтобы спасти людей некоторое время. Я не беру на себя ответственность за это, так что см. Оригинальные сообщения здесь и здесь для деталей.
df <- data.frame(x = 1:10, y = rep(1:2, 5), k = rnorm(10, 5,2), z = rep(c(2010, 2012, 2011, 2010, 1999), 2), j = c(rep(c("a", "b", "c"), 3), "d")) convert.magic <- function(obj, type){ FUN1 <- switch(type, character = as.character, numeric = as.numeric, factor = as.factor) out <- lapply(obj, FUN1) as.data.frame(out) } str(df) str(convert.magic(df, "character")) str(convert.magic(df, "factor")) df[, c("x", "y")] <- convert.magic(df[, c("x", "y")], "factor")
Я хотел бы указать, что если у вас есть НС в любом столбце, просто использование индексов не будет работать. Если в коэффициенте есть NA, вы должны использовать скрипт apply, предоставленный Ramnath.
Например
Df <- data.frame( x = c(NA,as.factor(sample(1:5,30,r=T))), y = c(NA,as.factor(sample(1:5,30,r=T))), z = c(NA,as.factor(sample(1:5,30,r=T))), w = c(NA,as.factor(sample(1:5,30,r=T))) ) Df[,c(1:4)] <- as.numeric(as.character(Df[,c(1:4)]))
Возвращает следующее:
Warning message: NAs introduced by coercion > head(Df) xyzw 1 NA NA NA NA 2 NA NA NA NA 3 NA NA NA NA 4 NA NA NA NA 5 NA NA NA NA 6 NA NA NA NA
Но:
Df[,c(1:4)]= apply(Df[,c(1:4)], 2, function(x) as.numeric(as.character(x)))
Возвращает:
> head(Df) xyzw 1 NA NA NA NA 2 2 3 4 1 3 1 5 3 4 4 2 3 4 1 5 5 3 5 5 6 4 2 4 4
У меня были проблемы с преобразованием всех столбцов в числовые с помощью вызова apply()
:
apply(data, 2, as.numeric)
Проблема заключается в том, что некоторые из строк имеют в них запятую – например, «1,024.63» вместо «1024.63» – и R не нравится этот способ форматирования чисел. Поэтому я удалил их, а затем бежал as.numeric()
:
data = as.data.frame(apply(data, 2, function(x) { y = str_replace_all(x, ",", "") #remove commas return(as.numeric(y)) #then convert }))
Обратите внимание, что для этого требуется, чтобы загружался пакет stringr.
Это то, что сработало для меня. Функция apply()
пытается принудить df к матрице и возвращает NA.
numeric.df <- as.data.frame(sapply(df, 2, as.numeric))
вы можете использовать unfactor()
из формы пакета «varhandle» CRAN:
library("varhandle") my_iris <- data.frame(Sepal.Length = factor(iris$Sepal.Length), sample_id = factor(1:nrow(iris))) my_iris <- unfactor(my_iris)