ベース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番目のケースですか?
デフォルトで[
を使用してデータフレームを抽出する場合、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"
名前付きベクトルが必要な場合は、単一列のデータフレームを抽出するのが難しい場合があります。考えられる回避策は、
do.call(c, df)[1]
#A1
#12
どこ、
str(do.call(c, df)[1])
Named num 12
- attr(*, "names")= chr "A1"
すべての値を名前付きベクトルに変換するため、名前の後に数値の接尾辞を追加して、名前が重複しないように注意してください
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"
デフォルトでは、Rは単一の列data.frames
をvectors
に変換します(drop = TRUE
を使用)。 drop = FALSE
を扱う場合は、オプションdata.frames
を使用することをお勧めします。これにより、データ型が変更されないようにすることができます。
したがって、代わりに:
df[1,]
使用する:
df[1, , drop = FALSE]
お役に立てれば。