Преобразование из списка в числовое значение в 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"