1. ホーム
  2. r

[解決済み] Rの行列の添え字の数が正しくない

2022-02-18 17:47:35

質問

そこで、次のような名前のデータフレームのリストを持っています。 "D1.txt", "D2.txt"................"D45.txt". Each of the file contains 2列で、各ファイルには1000行の行があります`。

以下のコードで、リスト内の各データフレームに新しいカラムを追加しようとしているのですが、以下のようなエラーが表示されます。 incorrect number of subscripts on matrix .

というコードになります。

L <- lapply(seq_along(L), function(i) { 
    L[[i]][, paste0('DF', i)] <-  1
    L[[i]] 
})

ここで L はデータフレームを含むリストの名前です。

なぜこのようなエラーが発生するのでしょうか?ありがとうございます。:)

編集部:再現性のある例です。

# Create dummy data
L <- replicate(5, expand.grid(1:10, 1:10)[sample(100, 10), ], simplify=FALSE)

# Add a column to each data.frame in L. 
# This will indicate presence of the pair when we merge.
L <- lapply(seq_along(L), function(i) { 
  L[[i]][, paste0('DF', i)] <-  1
  L[[i]] 
})

解決方法は?

を読むと "D1.txt", "D2.txt"................"D45.txt" ファイルは行列に変換され、そのため特定の for ループが失敗します。あなたの例を使ってみましょう。

L <- replicate(5, expand.grid(1:10, 1:10)[sample(100, 10), ], simplify=FALSE)

もし class(L[[1]]) を出力し、リストの最初の要素をピックアップします。 [1] "data.frame" を含むリストに対してforループを使用した場合、そのリストは data.frames を実行すると、エラーは発生せず、思い通りの結果が得られます。しかし、リストのすべての要素を行列に変換すると、次のようになります。

for(i in seq_along(L)){
     L[[i]] <- as.matrix(L[[i]])
}

でチェックし class(L[[1]]) を出力します。 [1] "matrix" . もし今 for ループで L となり、行列を含むようになります。

> L <- lapply(seq_along(L), function(i) { 
+   L[[i]][, paste0('DF', i)] <-  1
+     L[[i]] 
+     })
Error in `[<-`(`*tmp*`, , paste0("DF", i), value = 1) : 
  subscript out of bounds

したがって、ファイルを読み込むときに、強制的に data.frames を使うか、ファイルを読み込んで、それを data.frames を介して

 for(i in seq_along(L)){
    L[[i]] <- as.data.frame(L[[i]])
}

で、forループを使用します。