70

特定の文字列で始まる列名に基づいてデータをサブセット化する方法はありますか? 私はいくつかのABC_1 ABC_2 ABC_3ような列といくつかのような列を持っていますXYZ_1, XYZ_2,XYZ_3

テキストの上記の部分を含む列のみに基づいてサブセット化するにはどうすればよいですかdf(たとえば、ABCまたはXYZ)? インデックスを使用できますが、列がデータ内に分散しすぎており、ハード コーディングが多すぎます。

また、これらの各列の値が含まれている行のみを含めたいので、上記の列の>0いずれかに行が含まれている場合、最終的なデータ フレームに切り込みを入れます。61

4

8 に答える 8

104

greplあなたの名前を試してみてくださいdata.framegrepl正規表現をターゲットにTRUE一致させ、一致が見つかった場合は返し、FALSEそうでない場合は返します。関数はベクトル化されているため、一致する文字列のベクトルを渡すことができ、ブール値のベクトルが返されます。

#  Data
df <- data.frame( ABC_1 = runif(3),
            ABC_2 = runif(3),
            XYZ_1 = runif(3),
            XYZ_2 = runif(3) )

#      ABC_1     ABC_2     XYZ_1     XYZ_2
#1 0.3792645 0.3614199 0.9793573 0.7139381
#2 0.1313246 0.9746691 0.7276705 0.0126057
#3 0.7282680 0.6518444 0.9531389 0.9673290

#  Use grepl
df[ , grepl( "ABC" , names( df ) ) ]
#      ABC_1     ABC_2
#1 0.3792645 0.3614199
#2 0.1313246 0.9746691
#3 0.7282680 0.6518444

#  grepl returns logical vector like this which is what we use to subset columns
grepl( "ABC" , names( df ) )
#[1]  TRUE  TRUE FALSE FALSE

2 番目の部分に答えるには、サブセット data.frame を作成してから、保持する行にインデックスを付けるベクトル (論理ベクトル) を次のように作成します...

set.seed(1)
df <- data.frame( ABC_1 = sample(0:1,3,repl = TRUE),
            ABC_2 = sample(0:1,3,repl = TRUE),
            XYZ_1 = sample(0:1,3,repl = TRUE),
            XYZ_2 = sample(0:1,3,repl = TRUE) )

# We will want to discard the second row because 'all' ABC values are 0:
#  ABC_1 ABC_2 XYZ_1 XYZ_2
#1     0     1     1     0
#2     0     0     1     0
#3     1     1     1     0


df1 <- df[ , grepl( "ABC" , names( df ) ) ]

ind <- apply( df1 , 1 , function(x) any( x > 0 ) )

df1[ ind , ]
#  ABC_1 ABC_2
#1     0     1
#3     1     1
于 2013-09-03T08:28:03.070 に答える
37

次のようにstarts_withandを使用することもできます。dplyrselect()

df <- df %>% dplyr:: select(starts_with("ABC"))
于 2017-02-28T12:52:05.953 に答える
15

念のため、data.tableユーザーの場合、次のことがうまくいきます。

df[, grep("ABC", names(df)), with = FALSE]
于 2019-02-04T02:47:17.470 に答える
13

dplyr を使用すると、次のことができます。

df <- df %>% dplyr:: select(grep("ABC", names(df)), grep("XYZ", names(df)))
于 2016-10-13T20:40:53.450 に答える
0

上記を踏まえると、最も柔軟だと思います。dplyr を使用する必要があることに注意してください。ただし、それはひどいことではありません。

利点: " " 以外も検索できますcontains。ここではstarts_with、比較的一般的な文字列 "ST" に " " を使用しています。ここで" " を使用grepすると、すぐに気が狂ってしまう可能性があります。怒っている、私は言う!

library(dplyr)

df %>% dplyr::select(starts_with("ST",ignore.case = TRUE))
于 2021-09-26T21:10:20.577 に答える