2017-01-11 1 views
1

этот файл CSV данных Excel (так называемый сл) имеет 54 столбцов & 788 рядов нормированных данных между 0 & 1, который выглядит следующим образом: 0,39 0,16 0,27 0,60 ...Импорт CSV-файла Excel в RStudio и преобразование факторов в числовые, я получаю либо NA, либо новые данные; пытался устраняющие запятые, но все-таки получить Nas

> str(ff) 
'data.frame': 788 obs. of 54 variables: 
$ V1 : Factor w/ 66 levels " - "," 0.05 ",..: 25 36 33 44 36 37 39 20 

> dd <- as.numeric(as.character(ff)) 

Warning message: 
NAs introduced by coercion 


> dd <- gsub(".","",ff) 
> de <- as.numeric(as.character(dd)) 
> str(de) 
num [1:54] NA NA NA NA NA NA NA NA NA NA ... 

Я в недоумении. Я видел, что многие люди (возможно, новички, подобные мне) опубликовали несколько похожих вопросов, пожалуйста, примите мои извинения за то, что снова подняли этот вопрос. Заранее благодарю за ваши предложения.

+2

У вас есть элементы типа '' - ''. Предупреждающее сообщение является дружественным, и оно преобразует эти элементы в NA – akrun

+0

. Установите 'colClasses' в числовое значение при чтении –

+0

@ user7403680, вы все еще интересуетесь этим? Что-нибудь здесь помогло вам, или у вас все еще есть эта проблема? – rosscova

ответ

0

Я думаю, что у вас есть одна проблема: вы используете вызов as.numeric(as.character(.)) для всего кадра данных, а не для конкретного столбца. Результатом является вектор, длина которого равна числу столбцов в вашем кадре данных (обратите внимание, что ваш вывод представляет собой вектор длины 54, а не 788, как вы бы надеялись из столбца исходного кадра данных). Вот почему:

При преобразовании кадра данных символа, вы получите вектор обратно:

df <- data.frame(V1 = c(1,2,3), V2 = c(4,5,6)) 
as.character(df) 
[1] "c(1, 2, 3)" "c(4, 5, 6)" 

Обратите внимание, что каждый элемент вектора не векторный характер (т.е. c("1","2","3")), но на самом деле вектор, представляющий этот столбец, преобразованный в строку символов (то есть: "c(1, 2, 3)"). Поэтому, когда вы применяете as.numeric к этому вектору, вы получите вектор назад (а не кадр данных), и поскольку каждый элемент не может быть преобразован в число (или даже числовой вектор), вы получаете NA s назад:

as.numeric(as.character(df)) 
[1] NA NA 

Что вы, скорее всего, ищете, это преобразование для одного столбца, а не для всего кадра данных. Попытка:

ff$V1 <- as.numeric(as.character(ff$V1)) 

Таким образом, вы преобразовываете вектор в вектор, который должен дать вам результат, который вам нужен. Вы можете сделать это через каждую колонку с помощью lapply, что-то вроде:

df <- lapply(df, function(x) as.numeric(as.character(x))) 
df <- as.data.frame(df) 

(или еще лучше, установите colClasses, когда вы читаете файл в соответствии @ s.brunel замечания, так что вам не нужно беспокоиться об этом преобразовании вообще)

ПРИМЕЧАНИЕ также комментарий @ akrun. Вы должны ожидать предупреждение при преобразовании вектора, в котором некоторые значения не могут быть преобразованы в класс, который вы хотите. В вашем случае у вас есть значения " - ", которые не могут быть преобразованы в числовые, поэтому вместо них вы получите NA.

Смежные вопросы