特定の文字列で始まる列名に基づいてデータをサブセット化する方法はありますか? ABC_1 ABC_2 ABC_3
のような列とXYZ_1, XYZ_2,XYZ_3
のような列があります。
上記のテキスト部分を含む列(たとえば、df
またはABC
)のみに基づいてXYZ
をサブセット化するにはどうすればよいですか?インデックスを使用することはできますが、列がデータに散らばっており、ハードコーディングが多すぎます。
また、値が>0
であるこれらの列のそれぞれからの行のみを含めたいので、上の6
列のいずれかが行に1
を持っている場合、最終的なデータフレームにカットします。
data.frame
の名前でgrepl
を試してください。 grepl
は正規表現をターゲットに一致させ、一致が見つかった場合は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
starts_with
とdplyr
のselect()
も次のように使用できます。
df <- df %>% dplyr:: select(starts_with("ABC"))
Dplyrを使用すると、次のことができます。
df <- df %>% dplyr:: select(grep("ABC", names(df)), grep("XYZ", names(df)))
data.table
ユーザーの場合に備えて、次のように機能します。
df[, grep("ABC", names(df)), with = FALSE]
これは私のために働いた:
df[,names(df) %in% colnames(df)[grepl(str,colnames(df))]]