data.frame列をベクトルに変換しますか?


162

私は次のようなデータフレームを持っています:

a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)

次の列の1つをベクトルに変換しようとしましたが、機能しません。

avector <- as.vector(aframe['a2'])
class(avector) 
[1] "data.frame"

これが私が思いつくことができる唯一の解決策ですが、これを行うためのより良い方法がなければならないことを想定しています:

class(aframe['a2']) 
[1] "data.frame"
avector = c()
for(atmp in aframe['a2']) { avector <- atmp }
class(avector)
[1] "numeric"

注:上記のボキャブラリーがオフになっている可能性があります。オフになっている場合は修正してください。私はまだRの世界を学んでいます。さらに、ここで何が起こっているかについての説明はありがたいです(つまり、Pythonや他の言語に関連することは役に立ちます!)


5
あなたが答えを見ているように、をよく読む?'[.data.frame'と、あなたはとても遠くに行きます。
joran 2011

回答:


207

私は間違いなくこれを説明しようとするつもりですが、これはコメントで1つまたは2つの明確化を引き寄せると思います。

データフレームはリストです。列の名前とを使用してデータフレームをサブセット化する[と、サブリスト(またはサブデータフレーム)が取得されます。実際のアトミック列が必要な場合は、サブリストではなくベクトルを返す[[を使用できますaframe[,2]

したがって、このシーケンスを実行してみてください。そうすれば、より明確になります。

avector <- as.vector(aframe['a2'])
class(avector) 

avector <- aframe[['a2']]
class(avector)

avector <- aframe[,2]
class(avector)

6
+1これは便利です。私が使用して慣れていたaframe[,"a2"]ベクトル-なぜなら、両方のデータフレームと行列&でこれを使用できるのは、同じ結果を得るように見えます。
イテレータ2011

8
[..., drop = F]は常にデータフレームを返します
ハドリー

1
df$x構文はベクトルを返すため、これは特に知っておくと役に立ちます。私は長い間この構文を使用していましたが、列の使用を開始しdf['name']たりdf[n]、列を取得したりする必要があるときに、ベクトルを期待する関数に列を送信しようとすると問題が発生しました。すぐに使用df[[n]]またはdf[['x']]クリアしたもの。
rensa 2016年

8
as.vector静かに効果がないように見えるのはなぜですか?これはベクトルを返すか、著しく失敗するべきではありませんか?
bli

aframe[['a2']]ジオメトリ列が含まれているため、2つの列が返されるsfため、オブジェクトで非常に役立ちますaframe[,"a2"]
マット


32

$抽出を使用できます:

class(aframe$a1)
[1] "numeric"

または二重角括弧:

class(aframe[["a1"]])
[1] "numeric"

21

は必要ありませんがas.vector()、正しいインデックスが必要です。avector <- aframe[ , "a2"]

注意すべきもう1つのことは、次のdrop=FALSEオプション[です。

R> aframe <- data.frame(a1=c1:5, a2=6:10, a3=11:15)
R> aframe
  a1 a2 a3
1  1  6 11
2  2  7 12
3  3  8 13
4  4  9 14
5  5 10 15
R> avector <- aframe[, "a2"]
R> avector
[1]  6  7  8  9 10
R> avector <- aframe[, "a2", drop=FALSE]
R> avector
  a2
1  6
2  7
3  8
4  9
5 10
R> 

4
+1:のリマインダーdrop=FALSEは便利です。これは、data = 1。の場合にdata.frameからN列を選択できる場合に役立ちます。
イテレータ2011

選択した列の数が予測できないときにこれを使用します。1つの列が表示された場合でも、結果はn列のdata.frameとして渡されます。ベクトルは、モンキーレンチを機能の中に投げ込みます。
RomanLuštrik2011

11

'[['演算子を使用するもう1つの利点は、data.frameとdata.tableの両方で機能することです。したがって、関数をdata.frameとdata.tableの両方に対して実行する必要があり、その列をベクトルとして抽出したい場合は、

data[["column_name"]] 

最高です。


8

あなたはこのようなものを試すことができます

as.vector(unlist(aframe$a2))

これは、を使用して2つの列を比較する場合に適していますidentical
p-robot

5

抽出演算子を使用するだけで機能します。デフォルトでは、[]はoptionを設定しますdrop=TRUE。これがここで必要なものです。詳細については?'['、を参照してください。

>  a1 = c(1, 2, 3, 4, 5)
>  a2 = c(6, 7, 8, 9, 10)
>  a3 = c(11, 12, 13, 14, 15)
>  aframe = data.frame(a1, a2, a3)
> aframe[,'a2']
[1]  6  7  8  9 10
> class(aframe[,'a2'])
[1] "numeric"


3
a1 = c(1, 2, 3, 4, 5)
a2 = c(6, 7, 8, 9, 10)
a3 = c(11, 12, 13, 14, 15)
aframe = data.frame(a1, a2, a3)
avector <- as.vector(aframe['a2'])

avector<-unlist(avector)
#this will return a vector of type "integer"

2

リストを使用して、リストに%in%の値があるかどうかでデータフレームをフィルタリングします。

私は1列のデータフレームをExcelにエクスポートして手動でリストを作成し、Rに貼り付ける前に各要素の周りに ""を追加しました:リスト<-c( "el1"、 "el2"、...)通常は続いてFilteredData <-サブセット(データ、列%in%リスト)。

Stackoverflowを検索し、1列のデータフレームをリストに変換する直感的な方法が見つからなかった後、私は今までにないStackoverflowの貢献を投稿しています。

# assuming you have a 1 column dataframe called "df"
list <- c()
for(i in 1:nrow(df)){
  list <- append(list, df[i,1])
}
View(list)
# This list is not a dataframe, it is a list of values
# You can filter a dataframe using "subset([Data], [Column] %in% list")

1

data.frame列を一般的に単純なベクトルに変換することもできます。as.vectordata.frameクラスと構造を保持しているので十分ではないため、最初の(そして唯一の)要素を引き出す必要もあります。

df_column_object <- aframe[,2]
simple_column <- df_column_object[[1]]

これまでに提案されたすべてのソリューションでは、列タイトルをハードコーディングする必要があります。これはそれらを非ジェネリックにします(これを関数の引数に適用することを想像してください)。

あるいは、もちろん最初に列から列名を読み取ってから、他のソリューションのコードに挿入することもできます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.