データフレームから特定の列を抽出する


365

6列のRデータフレームがあり、列が3つだけの新しいデータフレームを作成します。

私のデータフレームをされたと仮定するとdf、私は列を抽出したいABと、Eこれが唯一の私が把握することができますコマンドです:

 data.frame(df$A,df$B,df$E)

これを行うよりコンパクトな方法はありますか?

回答:


156

data.frameが呼び出されている場合は、dplyrパッケージを使用しますdf1

library(dplyr)

df1 %>%
  select(A, B, E)

これは%>%パイプなしで次のように書くこともできます:

select(df1, A, B, E)

2
私の質問を投稿してからTidyverseがかなり進化したので、答えをあなたに切り替えました。
Aren Cambre

4
tidyverseの変化の猛烈な速度を考えると、このパターンを使用しないように注意します。これは、関数、パッケージ、またはアプリケーションのコードを記述するときに、列名をオブジェクト名であるかのように扱うことに対する私の強い好みに追加されます。
Joshua Ulrich

1
この回答が提出されてから4年以上が経過し、パターンは変更されていません。パイプ式の表現は非常に直感的である可能性があるため、魅力的です。
Aren Cambre

このサブセットに追加のコマンドを実行するにはどうすればよいですか?たとえば、rowMeanを計算したい場合: "df1%>%rowMeans(select(A、B、E))"が機能しません。
ベン

次のようなパイプラインをチェーンしますdf1 %>% select(A, B, E) %>% rowMeans(.)。次のように%>%入力して、パイプのドキュメントを参照してください?magrittr::`%>%`
Sam Firke

448

列名のベクトルを使用してサブセット化できます。subset()特に関数、パッケージ、またはアプリケーションでプログラミングする場合、列名をオブジェクト名(例:)であるかのように扱う方法よりも、このアプローチを強く推奨します。

# data for reproducible example
# (and to avoid confusion from trying to subset `stats::df`)
df <- setNames(data.frame(as.list(1:5)), LETTERS[1:5])
# subset
df[,c("A","B","E")]

4
それはエラーを与えますobject of type 'closure' is not subsettable
Aren Cambre 2012

24
@ArenCambre:data.frameは実際には名前が付けられていませんdfdfstatsパッケージの関数でもあります。
Joshua Ulrich、


2
@Cina:-"A"構文エラーです。そして?Extract、言う「、また、選択範囲の除外にする要素/スライスを示し、負の整数になります。」ij...
Joshua Ulrich

7
列Rを1つだけ抽出すると、データフレームではなくベクトルが返されるため、この構文には問題があります> df[,c("A")] [1] 1。これは望ましくない可能性があります。を使用subsetしても、この欠点はありません。
David Dorchies 16

100

これはsubset()関数の役割です:

> dat <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> subset(dat, select=c("A", "B"))
  A B
1 1 3
2 2 4

これを試してみると、自分のデータで次のエラーが発生します。「x [j]のエラー:添字タイプ 'list'が無効です」しかし、c( "A"、 "B")がリストでない場合、それは何ですか?
Rafael_Espericueta 2016年

@Rafael_Espericuetaコードを表示せずに推測するのは難しい...しかしc("A", "B")、リストではなくベクトルです。
ステファン・ローラン

データフレームをリストに変換します。
Suat Atan PhD 2017

78

明らかな選択肢が2つあります。ジョシュアウルリッヒdf[,c("A","B","E")]または

df[,c(1,2,5)]

のように

> df <- data.frame(A=c(1,2),B=c(3,4),C=c(5,6),D=c(7,7),E=c(8,8),F=c(9,9)) 
> df
  A B C D E F
1 1 3 5 7 8 9
2 2 4 6 7 8 9
> df[,c(1,2,5)]
  A B E
1 1 3 8
2 2 4 8
> df[,c("A","B","E")]
  A B E
1 1 3 8
2 2 4 8

16

どういうわけか

df[, (names(df) %in% c("A","B","E"))]

私のために働いた。上記の構文はすべて、「未定義の列が選択されました」という結果をもたらしました。



14

sqldfRデータフレームで選択を実行するパッケージを次のように使用することもできます。

df1 <- sqldf("select A, B, E from df")

これにより、出力としてdf1列A、B、Eのデータフレームが提供されます。



1
df<- dplyr::select ( df,A,B,C)

また、新しく作成したデータに別の名前を割り当てることができます

data<- dplyr::select ( df,A,B,C)

0

[ およびサブセットは置換できません:

[ 列が1つだけ選択されている場合は、ベクトルを返します。

df = data.frame(a="a",b="b")    

identical(
  df[,c("a")], 
  subset(df,select="a")
) 

identical(
  df[,c("a","b")],  
  subset(df,select=c("a","b"))
)

4
設定しない場合drop=FALSE。例:df[,c("a"),drop=F]
2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.