2

データフレームとベクターがあります。ベクターには、データフレーム内の列名の一部に対応する約 20 個の文字列値があります。データフレームには数百の列名があります。ベクトルに存在する部分的な列名に基づいて、データフレームをサブセット化する必要があります。

たとえば、データフレームの列名の 1 つが GRP20R.45.M の場合、ベクトルの値の 1 つが GRP20R になります。

ありがとう

4

2 に答える 2

4

v.names それが名前のベクトルであると仮定すると、使用greplして集約パターンをフィルタリングするために使用できます。

patt <- sub(',\\s','|',(toString(v.names)))
id.group <- grepl(patt,colnames(df))
df[,id.group]

ここに例があります:

v.names <- c('GRP20R','GRP20KA')
df <- data.frame(GRP20R.45.M=1,GRP20KA.25.8=2,hh=1)
patt <- sub(',\\s','|',(toString(v.names)))
id.group <- grepl(patt,colnames(df))
df[,id.group]

 GRP20R.45.M GRP20KA.25.8
1           1            2

ここで、df は次のとおりです。

df
  GRP20R.45.M GRP20KA.25.8 hh
1           1            2  1

ライナーソリューションを編集します(@thelatemailに感謝)

df[,grepl(paste0(v.names,collapse="|"),colnames(df))]
于 2013-07-25T02:54:26.907 に答える
2

テストデータ:

dat <-  data.frame(
          GRP20R.30.M="a",
          GRP20R.45.M="a",
          GRP40R.30.M="b",
          GRP40R.45.M="b",
          GRP60R.30.M="c",
          GRP60R.45.M="c"
        )

以下の文字列に部分的に一致する列のみを抽出します。

strings <- c("GRP20R","GRP60R")

すべての列名の語幹の長さが予測可能な場合は、次を使用できます。

dat[substr(colnames(dat),1,6) %in% strings]

列名の最初のピリオドより前の部分をより柔軟に比較したい場合は.、次を使用できます。

dat[gsub("(.)?\\..+","\\1",colnames(dat)) %in% strings]

結果を与える両方のオプション:

  GRP20R.30.M GRP20R.45.M GRP60R.30.M GRP60R.45.M
1           a           a           c           c
于 2013-07-25T03:13:33.387 に答える