データフレームの行をベクトルに変換する


116

データフレームの行からベクトルを作成します。しかし、行と列の名前を付ける必要はありません。私はいくつかのことを試みました...しかし運がありませんでした。

これは私のデータフレームです:

> df <- data.frame(a=c(1,2,4,2),b=c(2,6,2,1),c=c(2.6,8.2,7.5,3))
> df
  a b   c
1 1 2 2.6
2 2 6 8.2
3 4 2 7.5
4 2 1 3.0

私は試した:

> newV <- as.vector(df[1,])
> newV
  a b   c
1 1 2 2.6

しかし、私は本当にこのようなものを望んでいます:

> newV <- c( 1,2,2.6)
> newV
[1] 1.0 2.0 2.6

表示したデータを適切にフォーマットすることをお勧めします。改行がないようです。
Chinmay Patil 2013

行が欲しい。列「a」ではなく、行「1」。
Joko

これをデータフレームのすべての行に適用して、すべてのベクトルを単一のベクトルにマージする方法はありますか?
stephanmg

1
@stephanmg:次のようなものはどう c(t(as.matrix(df)))ですか?
Andri Signorell

Andri:うまくいきましたが、別の方法で解決することもできました。
stephanmg

回答:


154

データフレームから単一の行を抽出すると、1行のデータフレームが得られます。それを数値ベクトルに変換します。

as.numeric(df[1,])

@Rolandが示唆するようにunlist(df[1,])、名前を削除せずに1行のデータフレームを数値ベクトルに変換します。したがってunname(unlist(df[1,]))、同じ結果を得るには、もう少し明確な方法があります。

以下の@Joshのコメントのように、完全に数値ではない(アルファベット、係数、混合...)データフレームがある場合は、as.character(df[1,])代わりに必要です。


それは...彼らは、質問の本文とタイトルが文字化けしていても何を望むか明確に示されているもののコードを与えるためにOPに+1(または0ダウン票)であるかもしれない
ベンBolker

@ChinmayPatil、それらの他のオプションは何ですか?彼らのコード例は確かにそれが彼らが望むもののように見せます。
Ben Bolker 2013年

2
データフレームはすでにベクトルであるため、as.vectorはそれがモード「リスト」のベクトルであると認識し、何もしないことに注意してください。基礎となるメカニズムの理解を容易にするために、より具体的なas.vector(df [1、]、mode = "numeric")を試してください。これがas.numericが行うことです。

1
問題ない。私は、この問題についてはまったく同じ答えを与えると述べています。
Ben Bolker、2017

1
それまでの間は変更された可能性がありますが、今日のリストを解除すると名前を削除できます:( identical(unlist(df[1,], use.names = FALSE), as.numeric(df[1,])) そしてbtw dfはまだdata.frameの賢明な名前ではありません... ;
Signorell

45

unlist名前を保持することをお勧めします。

unlist(df[1,])
  a   b   c 
1.0 2.0 2.6 

is.vector(unlist(df[1,]))
[1] TRUE

名前付きベクトルが必要ない場合:

unname(unlist(df[1,]))
[1] 1.0 2.0 2.6

7

数値に変更したくない場合は、これを試すことができます。

> as.vector(t(df)[,1])
[1] 1.0 2.0 2.6

3
これは私にstr(as.vector(t(df)[,1]))はあまり意味がありません:is num [1:3] 1 2 2.6、つまり、コード結果を数値ベクトルに変換します...
Ben Bolker

2
具体的には、t(df)R を使用すると、データフレームが行列に強制されます。この場合、すべての要素が数値であるため、数値行列になります。次に[,1]、最初の列を抽出します(冗長な次元が自動的に削除されるため、数値ベクトル)。as.vector()名前を削除するだけです(これはでも実行できますunname())。
Ben Bolker 2013年

キャラクターにも効くようです。しかし、あなたは強制力について正しいです。FWIW、私のソリューションは文字データフレームでも機能します。すべてのデータが文字に変換されることに注意してください
Chinmay Patil 2013

2
私はunname(unlist(x))ソリューションが少し優れていると思います(より効率的でより透明です)。
ベンボルカー2013年

as.vector(t(df)[,1])大好きです !まさに私がそれを必要とするもの!
Uther Pendragon 2015年

7

これがdplyrベースのオプションです:

newV = df %>% slice(1) %>% unlist(use.names = FALSE)

# or slightly different:
newV = df %>% slice(1) %>% unlist() %>% unname()

2

行に因子が含まれている場合は注意が必要です。次に例を示します。

df_1 = data.frame(V1 = factor(11:15),
                  V2 = 21:25)
df_1[1,] %>% as.numeric() # you expect 11 21 but it returns 
[1] 1 21

これは別の例です(デフォルトではdata.frame()は文字を因子に変換します)

df_2 = data.frame(V1 = letters[1:5],
                  V2 = 1:5)
df_2[3,] %>% as.numeric() # you expect to obtain c 3 but it returns
[1] 3 3
df_2[3,] %>% as.character() # this won't work neither
[1] "3" "3"

この動作を防ぐには、要素を抽出する前に、その要素に注意する必要があります。

df_1$V1 = df_1$V1 %>% as.character() %>% as.numeric()
df_2$V1 = df_2$V1 %>% as.character()
df_1[1,] %>% as.numeric()
[1] 11  21
df_2[3,] %>% as.character()
[1] "c" "3"

-3

データフレームの列は既にベクトルであり、それらを引き出すだけです。必要な列をコンマの前ではなく、コンマの後に配置することに注意してください。

> newV <- df[,1]
> newV
[1] 1 2 4 2

行が実際に必要な場合は、ベンが言ったことを行い、将来的には正しく単語を使用してください。


OPが最初の行を望んでいると思いますか?
ベンボルカー2013年

1
@BenBolker多分そう...私は彼が彼のタイトルと質問が彼が望んだと言ったことを望んでいたと思いました。
ジョナサンクリステンセン2013年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.