web-dev-qa-db-ja.com

列が1つしかない場合に、データフレームの最初の行に名前を付ける方法は?

ベースRで予期しない動作に直面しています。

データフレームの最初の行とその列名をベクトルとして取得したいのですが、この一般的な方法はほとんどの場合に完全に機能します。

df = data.frame(A=c(12,13), B=c(24,25))
unlist(df[1,]) #class=numeric
#    A  B
#   12 24

ただし、データフレームが1つの列のみで構成されている場合、結果は名前のないベクトルに強制変換されます。

df = data.frame(A=c(12,13))
unlist(df[1,]) #class=numeric too
# 12

名前を保持する方法は2番目のケースですか?

9
Dan Chaltiel

デフォルトで[を使用してデータフレームを抽出する場合、drop引数はTRUEです。

?Extractから

drop-TRUEの場合、結果は可能な最小の次元に強制されます。

また、行を抽出した後、両方のデータフレームのクラスを確認できます。

df1 = data.frame(A=c(12,13), B=c(24,25))
df2 = data.frame(A=c(12,13))

class(df1[1, ])
#[1] "data.frame"
class(df2[1, ])
#[1] "numeric"

ご覧のように、df2は強制的にベクターに変換されます。 drop = FALSEを使用すると、データフレームとして保持され、ディメンションが削除されません。

df2[1,, drop = FALSE]
#   A
#1 12

class(df[1,, drop = FALSE])
#[1] "data.frame"
5
Ronak Shah

名前付きベクトルが必要な場合は、単一列のデータフレームを抽出するのが難しい場合があります。考えられる回避策は、

do.call(c, df)[1]
#A1 
#12 

どこ、

str(do.call(c, df)[1])
 Named num 12
 - attr(*, "names")= chr "A1"

すべての値を名前付きベクトルに変換するため、名前の後に数値の接尾辞を追加して、名前が重複しないように注意してください

4
Sotos

dplyrから

?slice

順序位置で行を選択する


library(dplyr)
slice(df, 1L)

#   A
#1 12

str(slice(df, 1L))
# 'data.frame': 1 obs. of  1 variable:
#$ A: num 12

名前付きの番号にしたい場合は、unlistできます。

str(unlist(slice(df, 1L)))
#Named num 12
# - attr(*, "names")= chr "A"

列名を保持したまま転置することもできます。

colnames(t(unlist(slice(df, 1L))))

#"A"
2
deepseefan

これはRのデフォルトの動作です。

デフォルトでは、Rは単一の列data.framesvectorsに変換します(drop = TRUEを使用)。 drop = FALSEを扱う場合は、オプションdata.framesを使用することをお勧めします。これにより、データ型が変更されないようにすることができます。

したがって、代わりに:

df[1,]

使用する:

df[1, , drop = FALSE]

お役に立てれば。

2
Louis