Изменение значений при преобразовании типа столбца в числовой
У меня есть файл данных с форматом сверху.
Я загрузил его в 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
Кто-нибудь знает, почему это происходит?
Ответы
Ответ 1
Похоже, что ваш второй столбец является фактором. Вам нужно использовать as.character
до as.numeric
. Это связано с тем, что факторы хранятся внутри как целые числа с таблицей, чтобы дать метки уровня факторов. Просто использование as.numeric
даст только внутренние целые коды. Нет необходимости использовать sapply
, поскольку эти функции векторизованы.
data[,2] <- as.numeric(as.character(data[,2]))
Вероятно, столбец является фактором, потому что в некоторых элементах есть некоторые нечисловые символы. Любые такие записи будут преобразованы в NA
с соответствующим предупреждением, но вы можете изучить это в своих исходных данных.
Как побочная заметка, data
является белым (хотя и недействительным) выбором для имени переменной, так как существует базовая функция с тем же именем.
Ответ 2
У меня была такая же проблема для матрицы, содержащей значения "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));
Ответ 3
Вероятно, гораздо лучше исправить это при чтении файла, чем при использовании as.numeric() или as.character(). При чтении файла убедитесь, что
-
header=TRUE
, если первая строка - это заголовок
-
NA
, а не NA
или NaN
(ctrl + H и заменить NA в вашем файле данных)
- никакие другие символьные строки в ваших числовых столбцах
Тогда R автоматически рассмотрит их как числовые.