Ошибка в Math.data.frame ..... нечисловая переменная во фрейме данных: - PullRequest
1 голос
/ 06 августа 2011

Я читаю CSV-файл в R и пытаюсь взять журнал данных. Файл csv содержит столбцы данных, причем первая строка содержит текстовые заголовки, а остальные числовые данные.

data<-read.csv("rawdata.csv",header=T)
trans<-log(csv2)

При этом я получаю следующую ошибку:

Ошибка в Math.data.frame (список (Доход = c (18766L, 20197L, 20777L, 23410L,: нечисловая переменная во фрейме данных: затраты

Вывод str должен быть вставлен в Q-тело:

data.frame': 167 obs. of 3 variables: 
 $ X: int 18766 20197 20777 23410 23434 22100 22337 21511 22683 23151 ... 
 $ Y: Factor w/ 163 levels "1,452.70","1,469.00",..: 22 9 55 109 158 82 131 112 119 137 ...
 $ Z: num 564 608 636 790 843 ...

Как мне исправить это?

Ответы [ 4 ]

2 голосов
/ 06 августа 2011

Тад!Y это фактор - большая проблема.Запятых там не должно быть.

Кроме того, у вашего исходного вопроса есть некоторые аномалии: data - это загруженный data.frame, но преобразование применяется к csv2.Вы переименовали столбцы?Если это так, вы не предоставили полную сводку шагов.В любом случае, проблема в том, что во втором столбце у вас запятые.

2 голосов
/ 06 августа 2011

РЕДАКТИРОВАТЬ: удалено предположение о структуре, учитывая, что она была предложена.

Дата-кадры - это списки, поэтому lapply будет циклически перебирать столбцы и возвращать математическую функцию, выполненную для них.

Если столбец является фактором (и здесь str (Costs) скажет вам), то вы можете использовать, возможно, неэффективный подход к преобразованию всех столбцов, как если бы они были факторами:

Costs_logged <- lapply(Costs, function(x) log(as.numeric(as.character(x))) )
Costs_logged

(см. FAQ попреобразование коэффициента в числовое значение.)

EDIT2: если вы хотите преобразовать факторную переменную с запятыми в метках, используйте этот метод:

data$Y <- as. numeric( gsub("\\,", "", as.character(data$Y)  ) )

В более ранней версии этого было толькообратная косая черта, но так как регулярное выражение и R используют обратные косые черты в качестве escape-символов, "специальные символы регулярного выражения" (см.? regex для перечисления) должны быть дважды экранированы.

1 голос
/ 07 августа 2011

Можете ли вы использовать первые несколько значений для переменной, которая доставляет вам неприятности? Если переменная «Costs» доставляет вам неприятности (как это выглядит в вашем примере), выполните что-то вроде этого:

data <- read.csv("rawdata.csv",header=T)
data[c(1:5),"Costs"]

Звучит так, как будто в файле csv есть столбец значений - столбец Y - с запятыми в числах. То есть, похоже, что ваш CSV-файл выглядит так:

X,Y,Z
"18766","1,452.70","564"
"20197","1,469.00","608"

или X, Y, Z, 18766, "1,452.70", 564 20197, "1,469.00", 608

или что-то подобное. Если это так, проблема в том, что столбец Y не может быть легко прочитан R с запятой в нем (хотя это облегчает чтение для нас, людей). Вам нужно избавиться от этих запятых; то есть, чтобы ваш файл данных выглядел так:

X,Y,Z
18766,1452.70,564
20197,1469.00,608

(вы можете оставить кавычки - просто избавьтесь от запятых в самих числах).

Есть несколько способов сделать это. Если вы экспортировали данные из Excel, отформатируйте этот столбец по-другому. Или, в качестве альтернативы, откройте CSV в Excel, сохраните его как файл с разделителями табуляции, откройте файл в своем любимом текстовом редакторе и найдите и удалите запятые («найти и заменить ничем»).

Затем попробуйте вернуть его обратно в R с помощью исходной команды.

0 голосов
/ 06 августа 2011

Очевидно, что столбцы не все числовые, поэтому просто убедитесь, что они есть.Вы можете сделать это путем принудительного определения класса каждого столбца при чтении в:

data <- read.csv ("rawdata.csv", colClasses = "numeric") </p>

(read.csvэто просто оболочка для read.table, а header = TRUE по умолчанию)

Это обеспечит все столбцы класса numeric, если это действительно возможно.

Если они действительно не являются числовыми столбцами, исключите те, которые вы не хотите преобразовывать, или просто работайте с столбцами по отдельности:

x <- data.frame(x = 1:10, y = runif(1, 2, 10), z = letters[1:10])

colClasses можно использовать для игнорированиястолбцы, указав «NULL», если это делает вещи проще.

Это эквивалентно, так как "x" и "y" - это первые 2 столбца:

log(x[ , 1:2])


log(x[ , c("x", "y")])

По отдельности:

log(x$x)

log(x$y)

Всегда важно проверять предположения оданные читаются из внешних источников.Базовые проверки, такие как summary (x), head (x) и str (x), покажут вам, каковы данные на самом деле.

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