R - от фактора к числовой или целочисленной ошибке - PullRequest
5 голосов
/ 01 февраля 2012

У меня есть кадр данных в R, который я загрузил из файла CSV.Одна из переменных называется «Сумма» и должна содержать положительные и отрицательные числа.

Когда я посмотрел на фрейм данных, тип этой переменной указан как фактор, и мне нужен его в числовом формате (хотя не уверен, какой это тип - целое число - числовое, ммм ...?).Итак, я попытался преобразовать его в один из этих двух форматов, но увидел интересное поведение.

Исходный кадр данных:

str(df)

Amount        : Factor w/ 11837 levels "","-1","-10",..: 2 2 1664 4 6290 6290 6290 6290 6290 6290 ...

Как я упоминал выше, я увидел нечто странное, когда пытался преобразовать его в числовое или целое число.Чтобы показать это, я собрал это сравнение:

df2 <- data.frame(df$Amount, as.numeric(df$Amount), as.integer(df$Amount))

str(df2)
'data.frame':   2620276 obs. of  3 variables:
 $ df.Amount            : Factor w/ 11837 levels "","-1","-10",..: 2 2 1664 4 6290 6290 6290 6290 6290 6290 ...
 $ as.numeric.df.Amount.: num  2 2 1664 4 6290 ...
 $ as.integer.df.Amount.: int  2 2 1664 4 6290 6290 6290 6290 6290 6290 ...

> head(df2, 20)
         df.Amount        as.numeric.df.Amount.       as.integer.df.Amount.
1               -1                           2                           2
2               -1                           2                           2
3             -201                        1664                        1664
4             -100                           4                           4
5                1                        6290                        6290
6                1                        6290                        6290
7                1                        6290                        6290
8                1                        6290                        6290
9                1                        6290                        6290
10               1                        6290                        6290
11               1                        6290                        6290
12               1                        6290                        6290
13               1                        6290                        6290
14               1                        6290                        6290
15               1                        6290                        6290
16               1                        6290                        6290
17               1                        6290                        6290
18               2                        7520                        7520
19               2                        7520                        7520
20               2                        7520                        7520

Функции as.numeric и as.integer берут переменную Amount и что-то с ней делают, но я не знаю, что это такое.Моя цель - перевести переменную Amount в некоторый тип числового типа данных, чтобы я мог выполнить для него сумму / среднее / и т. Д.

Что я делаю неправильно, что вызывает странные цифры, и что я могу сделать, чтобы это исправить?

Ответы [ 4 ]

11 голосов
/ 01 февраля 2012

Корень проблемы, скорее всего, в каком-то необычном значении в импортированном CSV. Если это произошло от Excel, это не редкость. Это может быть символ процента, символ «комментарий» из Excel или любой другой длинный список. Я бы посмотрел на CSV в вашем редакторе выбора и посмотреть, что вы можете увидеть.

Кроме этого, у вас есть несколько вариантов.

read.csv принимает необязательный аргумент stringsAsFactors, который можно установить на FALSE

Коэффициент сохраняется в виде целочисленных уровней, которые отображаются на значения. Когда вы конвертируете напрямую с помощью as.numeric, вы получите целочисленные уровни, а не начальные значения:

> x<-10:20
> as.numeric(factor(x))
 [1]  1  2  3  4  5  6  7  8  9 10 11
> 

иначе посмотрите на ?factor:

В частности, числовое значение, применяемое к фактору, не имеет смысла и может происходить путем неявного принуждения. Для преобразования коэффициента f приблизительно в исходные числовые значения, рекомендуется as.numeric(levels(f))[f] и немного эффективнее, чем as.numeric(as.character(f)).

Тем не менее, я подозреваю, что это будет ошибка, потому что на входе есть что-то, кроме числа.

10 голосов
/ 01 февраля 2012

@ Джастин прав.Вот пошаговое руководство о том, как найти ошибочные значения:

# A sample data set with a weird value ("4%") in it
d <- read.table(text="A B\n1 2\n3 4%\n", header=TRUE)
str(d)
#'data.frame':   2 obs. of  2 variables:
# $ A: int  1 3
# $ B: Factor w/ 2 levels "2","4%": 1 2

as.numeric(d$B) # WRONG, returns 1 2 (the internal factor codes)

# This correctly converts to numeric
x <- as.numeric(levels(d$B))[d$B] # 2 NA

# ...and this finds the offending value(s):
d$B[is.na(x)]  # 4% 

# and this finds the offending row numbers:
which(is.na(x)) # row 2

Обратите внимание, что если в вашем наборе данных отсутствуют значения, закодированные как-то, кроме пустой ячейки или строки «NA», вы должны указатьчто читать. Таблица:

# Here "N/A" is used instead of "NA"...
read.table(text="A B\n1 2\n3 N/A\n", header=TRUE, na.strings="N/A")
1 голос
/ 27 июня 2019

Просто преобразуйте значения коэффициентов сначала в символьные, а затем в числовые. Это должно решить вашу проблему.

as.numeric(as.character(df$Amount))
1 голос
/ 30 января 2014

Я новичок здесь, но я использую этот форум для своих запросов. У меня была похожая проблема, но ниже работал для меня. Я портирую данные из txt файла во фрейм данных

data <- read.delim(paste(folderpath,"data.txt",sep=""),header=TRUE,sep="\\",as.is=6)

Обратите внимание, что я использовал as.is в столбце 6, в котором были числовые данные, а также некоторые символы мусора в некоторых строках. Использование as.is переносит данные в виде символов в столбце 6. Затем следующие символы изменили символы в столбце 6 на числовые значения. все значения мусора были преобразованы в NA, которые могут быть удалены позже.

data[,6] <- as.numeric(data[,6])

Надеюсь, это поможет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...