web-dev-qa-db-ja.com

Rでリストから数値に変換する

最近、値を持つテーブルを含むcsvファイルを読み取るたびに、Rが数値ではなくリスト形式として読み取るという問題が発生しました。私の状況に対するすべての答えを提供するスレッドはなかったので、実行できるようになったら、誰かに役立つことを期待して、私のために働いたスクリプトをここに含めることにしました。ここに、いくつかの説明と、必要な場合のためのいくつかのオプションがあります。

(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コマンドを使用して、マトリックスが数値形式であることを確認できます。

mode(dataNum)

(7)オプション:行列を転置したい場合は、次の命令を使用できます。

dataNum <- t(dataNum)
14
Edgardo Ortiz

以下は、data.frameを数値行列に変換する、より短い/より速い方法です。

data <- data.matrix(data)

もあります

data <- as.matrix(data)

ただし、重要な違いの1つは、データに因子列または文字列が含まれているかどうかです: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"
21
flodel