0

ファイルの行ごとにクリーニングする必要があるデータがあり、クリーニングしたデータを SQLite3 データベースに挿入したいと考えています。dataframeを必要とするRSQLiteライブラリを使用しています。動作させようとしているコードは次のとおりです。

# Select feature names for use as column names in X train/test loading
feature_names <- unlist(dbGetQuery(con, "select feature_name from features order by feature_id"), use.names = FALSE);

# Load X training data
X_train_lines <- readLines("data/train/X_train.txt"); # Space delimited with leading and trailing spaces
X_train_values <- vector("list", length(X_train_lines));
names(X_train_values) <- feature_names; # colnames or names?
for (index in 1:length(X_train_lines)) {
  cleaned_line <- gsub("^ *|(?<= ) | *$", "", X_train_lines[index], perl=TRUE); # remove extraneous whitespaces
  X_train_values[index] <- strsplit(cleaned_line, " "); # Wondering if X_train_values[index] is correct? 
}
# Write features data to features table
dbWriteTable(con, "X_train", as.data.frame(X_train_values), row.names = FALSE);

コードは問題なく実行されますが、DbVisualizer を使用してデータベースを見ようとすると、エラーが発生します。

操作の実行中にエラーが発生しました:
不正なデータベース スキーマ (X_train) - X_train の列が多すぎます

私の唯一の推測は、行と列が何らかの形で転置されているということです。私の列名はfeature_namesベクトルの値でなければなりません。

また、誰かがより良いアプローチのための提案があれば...

アップデート

何を見ているのかわかりませんでしたが、dput を実行してみました。まとめのトップはこうです。

head(summary(X_train_values))

                   Length Class    Mode       
tBodyAcc-mean()-X "561"  "-none-" "character"
tBodyAcc-mean()-Y "561"  "-none-" "character"
tBodyAcc-mean()-Z "561"  "-none-" "character"
tBodyAcc-std()-X  "561"  "-none-" "character"
tBodyAcc-std()-Y  "561"  "-none-" "character"
tBodyAcc-std()-Z  "561"  "-none-" "character"

繰り返しますが、これはデータがすべて混同されていると私に信じさせます。561 列が必要であり、その一部は上で tBodyAcc-mean()-X などとして表されています。列の値は、上に表示されていない浮動小数点数である必要があります。

table コマンドが機能しませんでした:

table(X_train_values)
Error in table(X_train_values) : 
  attempt to make a table with >= 2^31 elements

561 列の 7,352 行が必要です。

更新 2

私の問題は、配列や配列のようなリストを使用しようとしていることだと思います。たとえば、Ruby では、次のようなことができます。

x_train_values = []
x_train_lines.each { |line| x_train_values << line.split(' ') }
4

1 に答える 1

0

次の行で

for (index in 1:length(X_train_lines)) {
    cleaned_line <- gsub("^ *|(?<= ) | *$", "", X_train_lines[index], perl=TRUE);
    X_train_values[index] <- strsplit(cleaned_line, " ");
}

[二重角括弧 ( ) を使用する必要があるときに、データ フレームの列にアクセスするために単一角括弧 ( ) を使用しています[[。を使用すると、 に等しい 1 つの列を持つデータ フレームが返さX_train_lines[index]ますX_train_lines[index]。ただし、を使用するX_train_lines[[index]]と、その列の実際の内容が返されます (詳細については、http://adv-r.had.co.nz/Subsetting.htmlを参照してください)。

さて、gsub動作する方法は、最初に引数を使用して文字に変換しas.character、次にそれを処理することです。あなたの場合、X_train_lines[index]単一の列が要因である data.frame を返します(推測します)。したがって、文字に強制すると、実際の内容ではなく要因レベルが取得されます。したがって、実際にはgsub「1:2:3:...」のような文字列を呼び出しています。代わりに二重括弧を使用するgsubと、(データ フレームの代わりに) 要素が文字に強制され、必要に応じて機能します。

余談ですが、R では、行を で終わらせる必要はありません;。これは、同じ行で複数のステートメントを区切るためにのみ必要です。

最後に、forループは遅くなる可能性があり、必要なことを通常は達成できる単純な構文のより効率的な関数があるため ( 、 、 など)、ループlapplyapply回避sweepすることをお勧めします。データフレーム/マトリックス/などの列/行/要素ごとの操作には、を使用できますapply。この場合、コードは次のようになります

apply(X_train_values, 2, gsub, pattern = "^ *|(?<= ) | *$",
    replacement = "", perl = T)
于 2014-07-03T13:20:19.157 に答える