Преобразование из списка в числовое значение в R
У меня недавно возникла проблема, когда каждый раз я читал файл csv, содержащий таблицу со значениями, R читал ее как формат списка, а не числовой. Поскольку ни один поток не предоставил мне весь ответ на мою ситуацию, как только я смог его запустить, я решил включить здесь script, который работал у меня в надежде, что он кому-то полезен. Вот оно, с некоторым описанием и некоторыми вариантами в случае необходимости:
(1) Прочитайте данные из файла csv. Здесь у файла нет заголовка, поэтому я помещаю F, если у вас есть заголовок, а затем измените его на T.
data <- read.csv("folder_path/data_file.csv", header=F)
(1.a) Примечание. Если вы получите предупреждение о том, что "неполная конечная строка найдена с помощью readTableHeader", это означает, что R не нашел символ конца файла. Просто добавьте лишнюю пустую строку в конец файла csv, и сообщение не появится снова.
(2) Вы можете проверить, что данные находятся в формате списка (если оно числовое, тогда вы все настроены и вообще не нуждаетесь в этой процедуре!) с помощью команды mode.
mode(data)
(3) Инициализируйте матрицу (как NA), где вы хотите, чтобы данные в числовом формате, используя размеры данных.
dataNum <- matrix(data = NA, nrow = dim(data)[1], ncol = dim(data)[2])
(4) ДОПОЛНИТЕЛЬНО: Если вы хотите добавить имена в свои столбцы и/или строки, вы можете использовать их, если эти параметры.
(4a) Добавить имена в столбцы и строки, предполагая, что каждая из них имеет схожую информацию, другими словами, вы хотите, чтобы имена были col_1, col_2,... и row_1, row_2,...
colnames(dataNum) <- colnames(dataNum, do.NULL = F, prefix = "col_")
rownames(dataNum) <- rownames(dataNum, do.NULL = F, prefix = "row_")
(4b) Если вам нужны разные имена для каждого столбца и каждой строки, используйте этот параметр и добавьте все имена вручную.
colnames(dataNum) <- c("col_name_1", "col_name_2")
rownames(dataNum) <- c("row_name_1", "row_name_2")
(5) Преобразуйте данные из списка в числовую форму и поместите в матричный dataNum.
for (i in 1:dim(data)[2]) {
dataNum[,i] <- c(as.numeric(data[[i]]))
}
(6) Вы можете проверить, что матрица находится в числовом формате с помощью команды режима.
mode(dataNum)
(7) ДОПОЛНИТЕЛЬНО: Если вы хотите перенести матрицу, вы можете использовать следующую команду.
dataNum <- t(dataNum)
Ответы
Ответ 1
Вот более короткий/быстрый способ превратить ваш data.frame в числовую матрицу:
data <- data.matrix(data)
Существует также
data <- as.matrix(data)
но одно важное отличие состоит в том, что ваши данные содержат столбцы факторов или символов: as.matrix
будет принуждать все к матрице символов, а data.matrix
всегда будет возвращать матрицу numeric
или integer
.
data <- data.frame(
logical = as.logical(c(TRUE, FALSE)),
integer = as.integer(c(TRUE, FALSE)),
numeric = as.numeric(c(TRUE, FALSE)),
factor = as.character(c(TRUE, FALSE))
)
data.matrix(data)
# logical integer numeric factor
# [1,] 1 1 1 2
# [2,] 0 0 0 1
as.matrix(data)
# logical integer numeric factor
# [1,] " TRUE" "1" "1" "TRUE"
# [2,] "FALSE" "0" "0" "FALSE"