3

私は R とプログラミング全般に非常に慣れていないため、〜 2000 の .xls および .xlsx ファイルに含まれるデータを並べるのに助けが必要です。各ファイルは、ヘッダーの前に 34 ~ 40 行の範囲の「ジャンク」テキストで始まります。ヘッダーの下のすべてのデータは同じ次元です。

私が試した最初の方法は、リストにデータを追加しました。垂直フォーマットは役に立ちませんでした。

library(readxl)
file.list <- list.files(pattern='*.xls')
dm.list <- lapply(file.list, read_excel)

現在、一度に 1 つのファイルを読み込み、「ジャンク」テキストを削除し、.csv ファイルに書き込もうとしています (データを列ごとに追加します)。

library(readxl)
file.list <- list.files(pattern='*.xls')

for(i in 1:dim.data.frame(file.list))

store.matrix <-  read_excel((paste0("C:\\Users\\jlmine\\Desktop\\qPCRextData\\", file.list[i])), sheet = "Results")

while (store.matrix[1,1] != "Well") #search for header
{  store.matrix <- store.matrix[-c(1)] } #delete non-header rows

write.csv(store.matrix, file = "qPCRdataanalysis.csv", append = TRUE)

次の行はエラーをスローしています。

store.matrix <- read_excel((paste0("C:\\Users\\jlmine\\Desktop\\qPCRextData\\", file.list[i])), sheet = "Results")

エラー: 'C:\Users\jlmine\Desktop\qPCRextData\' は存在しません。さらに: 警告メッセージ: In 1:dim.data.frame(file.list) :
数値式に 2 つの要素があります: 最初に使用された要素のみ

「C:\Users\jlmine\Desktop\qPCRextData\」が作業ディレクトリとして設定されました。

4

2 に答える 2

0

データの一部を見ないとわかりませんが、各ファイルを読み込んで、「実際の」データが始まる行を見つけてから、「がらくた」行を削除できるようです。例えば:

df.list = lapply(file.list, function(f) {

  # Read file
  tmp = read_excel(f, sheet="Results")

  # Find highest index of row containing "Well" and add 1 (assuming here
  # that a row containing "Well" will come before the header row).
  s = which(apply(tmp, 1, function(x) {grep("Well", x)}) > 0)
  s = ifelse(length(s) > 0, max(s) + 1, 0)

  # Reset column names to the values in row s (the actual header row)
  # Remove rows 1 through s (the "junk" text plus the header row) from the data frame
  if(s > 0) {
    names(tmp) = tmp[s, ]
    tmp[-(1:s), ]
  }

})

df.listロードした xls/xlsx ファイルの 1 つである各要素のリストが表示されます。データを列ごとに結合したいと言っていましたが、各データ フレームに同じ列がある場合は、データ フレームをスタックしたくありません。それを行うには、次のようにします。

df.list = do.call(rbind, df.list)

これで、csv ファイルとして保存できる単一のデータ フレームが作成されました。

于 2016-09-22T03:37:42.640 に答える
0

.xlsx ファイルにアクセスできない場合、問題は for ループ ステートメントにあるようです。list.files指定されたディレクトリ内のファイルの文字ベクトルを返します。長さ 5 のベクトル x を使用dim.data.frameすると、次の結果が得られます。

#[0, 5]

また、警告メッセージから、最初の要素のみが for ループで使用されていることがわかります。したがって、何もループしていません。

したがって、すべてのファイルをよりエレガントにループしたい場合は、次のようにします...

for (i in seq(length(file.list)) {
于 2016-09-22T03:24:04.200 に答える