2016-10-23 21 views
-1

Microsoft Open R 3.3では、データベースクエリから行をコピーして(データフレームを返す)、行列の行に挿入する方法はありますか?私は要素ごとにそれを行うことができますが、私は一度に行をコピーすることができるはずです。しかし、私はできません:Rのデータフレームから行列に行をコピーする方法は?

> m = matrix(0, nrow=2, ncol=3) 
> dim(m) 
[1] 2 3 
> dim(m[1,]) 
NULL 
> f = dbGetQuery("SELECT id, name, age FROM users") 
> dim(f) 
[1] 300 3 
> dim(f[1,]) 
[1] 1 3 
> m[1,] = f[1,] 
> m[1,] 
Error in m[1, ] : incorrect number of dimensions 
> dim(m) 
NULL 
> m[1,] = f[1,] 
Error in m[1, ] = f[1, ] : 
    incorrect number of subscripts on matrix 

fをas.matrix(f)に変換することは役に立ちません。

なぜdim(m [1、])は "1 3"ではなく "NULL"ですか?

なぜm [1、] = f [1、]は初めてmのデータ構造を破壊する(dim(m)をNULLに変更する)が、2回目までエラーを報告しない?

これは、データフレームの行に異なるタイプが含まれている可能性がありますが、行列の行はできないと考えられます。フレームの1列は文字データであり、その他は整数です。

+1

m [1、]は単なる数値ベクトルです。ディメンションを保持したい場合は、最初に '? '[''を読んで、 'drop'引数の使用に注意してください。構造は "破壊されていない"。あなたは単に出力を誤解しているだけです。 –

+0

私は内部構造の次元が失われているので、構造が破壊されていると言います。 dim(m)は、その代入の後ではなくNULLを返します。その情報を質問に追加するために今編集する。 –

+0

'f'がこれまでに提供された証拠からのデータフレームであったことは本当にわかりません。あなたは 'dput(f [1、]' –

答えて

2

あなたはf[1,]リストである1つの行のデータフレームを返すので、m[1,]が原子ベクトルを返し、これは問題なぜ(M [1])暗い応答し、f[1,]をunlisting後の値を割り当てることができなければなりません"1 3"ではなく "NULL"?の場合、1Dのアトミックベクトルには次元属性がありません。アトムベクトルにリストを代入しようとすると、問題が発生します。

m = matrix(0, nrow=2, ncol=3) 
f = data.frame(x = 1:3, y = 2:4, z = 3:5) 
m 
#  [,1] [,2] [,3] 
#[1,] 0 0 0 
#[2,] 0 0 0 
m[1,] = unlist(f[1,]) 
m 
#  [,1] [,2] [,3] 
#[1,] 1 2 3 
#[2,] 0 0 0 

class(m[1,]) 
#[1] "numeric" 
class(f[1,]) 
#[1] "data.frame" 
関連する問題