Изменение значений при преобразовании типа столбца в числовой - PullRequest
21 голосов
/ 13 июня 2011

У меня есть файл данных в формате сверху.
Я загрузил его в R и попытался построить гистограмму со значениями из столбца dist, и у меня появилась ошибка «x должно быть числовым». Поэтому я попытался изменить формат.

> head(data)

    V1        V2
1 type gene_dist
2    A     64667
3    A     76486
4    A     97416
5    A     30876
6    A     88018

> summary(data)
    V1            V2     
 A   : 67   100    :  1  
 B   :122   100906 :  1  
 type:  1   102349 :  1  
            1033   :  1  
            10544  :  1  
            10745  :  1  
            (Other):184  

Я попытался установить формат для столбца, используя sapply, но значения изменились:

> data[,2]<-sapply(data[,2],as.numeric)

> head(data)
    V1  V2
1 type 190
2    A 146
3    A 166
4    A 189

summary(data)
    V1            V2        
 A   : 67   Min.   :  1.00  
 B   :122   1st Qu.: 48.25  
 type:  1   Median : 95.50  
            Mean   : 95.50  
            3rd Qu.:142.75  
            Max.   :190.00 

Кто-нибудь знает, почему это происходит?

Ответы [ 4 ]

42 голосов
/ 13 июня 2011

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

data[,2] <- as.numeric(as.character(data[,2]))

Вполне вероятно, что столбец является фактором, поскольку в некоторых записях есть нечисловые символы.Любые такие записи будут преобразованы в NA с соответствующим предупреждением, но вы, возможно, захотите изучить это в ваших необработанных данных.

В качестве примечания, data - плохой (хотя и недействительный) выбордля имени переменной, поскольку существует базовая функция с тем же именем.

0 голосов
/ 01 июня 2018

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

df <- read.table(doc.csv, header = TRUE, sep = ",", dec = ".")
df$value

# Results in
[1]  2254    1873    2201    2147    2456    1785

# So..
as.numeric(df$value)
[1] 26 14 22 20 32 11

В моем случае причина была в томбыли пробелы со значениями в исходном документе CSV.Удаление пробелов устранило проблему.

Из dput (df)

" 1178  ", " 1222  ", " 1223  ", " 1314  ", " 1462  ", 
0 голосов
/ 06 июня 2017

Вероятно, это гораздо лучше исправить при чтении файла, чем при использовании as.numeric () или as.character (). При чтении вашего файла убедитесь, что у вас есть

  • header=TRUE, если первая строка - заголовок
  • NA, а не Na или NaN (Ctrl + H и заменить на NA в вашем файле данных)
  • нет других символьных строк в ваших числовых столбцах

Тогда R автоматически будет считать их числовыми.

0 голосов
/ 04 августа 2014

У меня была такая же проблема для матрицы, содержащей значения 'list', когда объект data считывался из read.csv.as.character() здесь не работает, а as.numeric() и data.matrix() изменили значения в матрице.Вместо этого вам нужно использовать следующее:

matrix_numeric[1:m,1:n] <- as.numeric(as.matrix(data[1:m,1:n]))

Сначала преобразование в символ, а затем в двойник.Для данных размеров матрицы [m, n].(перед назначением значений необходимо сначала создать объект matrix_numeric ... matrix_numeric <- matrix(0,m,n))

Для вектора vec1 в формате списка используется следующее:

out1 <- as.numeric(unlist(vec1));

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