2012-02-24 5 views
3

私はこのような何か場合:R:(rbindの呼び出しで制御自動作成カラム名を)

> df <- data.frame() 
> rbind(df, c("A","B","C")) 
    X.A. X.B. X.C. 
1 A B C 

をあなたが行が空のデータフレームに追加されます見ることができます。ただし、列はデータの内容に基づいて自動的に名前が付けられます。

> df <- rbind(df, c("P", "D", "Q")) 

自動的rbindによって作成されます列の名前を制御する方法があります:私は後でする場合は

これが問題の原因は?または私がここでやろうとしていることをする他の方法?

+0

なぜ次のrbindを実行する前に列の名前を変更できませんか? –

+0

これは、これらの文字列が要素に暗黙的に変換されることと関連しています。下記の@ baha-kevの答えを参照してください。 – laslowh

+2

下記の質問に回答してください。 'options(stringsAsFactors = FALSE)'は変換を要素に固定します。そして、いいえ、この「rbind」を実行している間に要因を使用する必要はありません。 'stringsAsFactors'オプションが設定されると、現在の' rbind'ステップはうまく動作します。しかし、おそらく 'data.frame'を構築する別の方法のためのケースを作ることができます。 – Justin

答えて

7

:あなたは要因を使用したい場合、あなたはこのようにそれを変換することができ、

df=data.frame(first = 'A', second = 'B', third = 'C', stringsAsFactors=FALSE) 
rbind(df,c('Horse','Dog','Cat')) 
    first second third 
1  A  B  C 
2 Horse Dog Cat 

sapply(df2,class) 
     first  second  third 
"character" "character" "character" 

その後@ baha-kevは文字列や要素に関して良い答えを持っています。

私はちょうどdata.frameのためrbindの奇妙な行動を指摘したい:

# This is "should work", but it doesn't: 
# Create an empty data.frame with the correct names and types 
df <- data.frame(A=numeric(), B=character(), C=character(), stringsAsFactors=FALSE) 
rbind(df, list(42, 'foo', 'bar')) # Messes up names! 
rbind(df, list(A=42, B='foo', C='bar')) # OK... 

# If you have at least one row, names are kept... 
df <- data.frame(A=0, B="", C="", stringsAsFactors=FALSE) 
rbind(df, list(42, 'foo', 'bar')) # Names work now... 

しかし、あなたは文字列だけが、なぜ代わりに行列を使用していない場合?その後、空の行列から始めるとうまくいきます。

# Create a 0x3 matrix: 
m <- matrix('', 0, 3, dimnames=list(NULL, LETTERS[1:3])) 

# Now add a row: 
m <- rbind(m, c('foo','bar','baz')) # This works fine! 
m 

# Then optionally turn it into a data.frame at the end... 
as.data.frame(m, stringsAsFactors=FALSE) 
2

設定し、文字としての値を格納するオプションをFalseに "stringsAsFactors"、:

df2 = as.data.frame(df, stringsAsFactors=T) 
+0

私のすべてのデータが文字であることを暗示した場合は申し訳ありません。彼らはそうではありません、彼らは任意の文字列です。これは助けになります。私はこの猫を皮膚にさらす別の方法は、それらが要因に変わることを防ぐことだと思います、私はそれを行うことはできますか? – laslowh

+0

data.frameオブジェクトを使用する場合は、データを要素として保持する必要があると思います。私は任意の文字列を受け入れるために私の答えでコードを編集しました。 –

+0

なぜ「あなたのデータを要因にする必要があるのか​​」を簡単に説明できますか?あなたの忍耐をありがとう、私はnewbです。 – laslowh

関連する問題