2017-09-21 14 views
1

以下のデータには、単位(1〜8)の列名があります。各単位には、スコアとパーセントの列があります。 num_range()ヘルパーでdplyr::select()を使用して、スコアの1〜3だけを選択する方法はありますか?私は接尾辞を落とすとそれを得ることができます(unit_1_scoreの代わりに単なるunit_1なので)。そうでなければ私の試みは成功しませんでした。私はdplyr::select(d, num_range("unit_", 1:3, "_score"))を試しましたが、それはうまくいかないようです。どんな助けもありがとう。数値が列名の中央にある場合、 `dplyr :: select(num_range())`

d <- readr::read_csv("https://data.jacksonms.gov/api/views/97iy-g8hk/rows.csv") 
d <- janitor::clean_names(d) 
names(d) 

[1] "test_year"    "test_type"    "test_site"    "student_id"   
[5] "pre_test_score"  "pre_test_percent"  "post_test_score"  "post_test_percent"  
[9] "percentage_change"  "unit_1_score"   "unit_1_percent"  "unit_2_score"   
[13] "unit_2_percent"  "unit_3_score"   "unit_3_percent"  "unit_4_score"   
[17] "unit_4_percent"  "unit_5_6_score"  "unit_5_6_percent"  "unit_7_score"   
[21] "unit_7_percent"  "unit_8_score"   "unit_8_percent"  "total_score"   
[25] "total_percent_correct" 
+0

あなたは 'unit_5_6_score'列を持っていますか?あなたは '3:5'と' 6:8'の両方で動作することを期待していますか? – MrFlick

+5

'dplyr :: select(d、paste0(" unit_ "、1:3、" _score "))'はどうですか? – www

+0

ええ、私はそれが私のデータではないことを認識していますが、それは私が1-3について尋ねた理由の一部です。より一般的なケースを理解しようとしています。 –

答えて

2

この回答がトピック外であるとは考えられません。 dplyrを使用していなくても有効な応答に満足していると仮定しています。

正規表現を使用してdata.frameの特定の列を簡単に選択できます。たとえば、ユニット1〜3のみを選択するには、次のように試してみてください。d[, grep(x = colnames(d), pattern = "^unit_[1-3]{1}_.*$)"]dのカラム名に "unit_"で始まるカラムが1、2、または3(1回のみ)、その後ゼロ後で何か。

+0

ありがとうございます。私はそれを理解し、それを定期的に使用していますが、実際にはnum_rangeの動作を理解しようとしていました。 –

+1

これは、感謝のために感謝しました:) –

4

我々はdplyr::matches()を使用して正規表現の範囲で列を選択できます。

select(d, matches("unit_[1-3]_score")) 
1

5_6列が(誰が、それは良いアイデアだと思った!?)トリッキーになるだろうしているにもかかわらず、あなたは新しいtidyevalを見つけるかもしれませんこれに便利な概念、まさにこれが何をするのかについて

dplyr::select(d, !!!rlang::syms(paste0("unit_", 1:3, "_score"))) 
#> # A tibble: 48 x 3 
#> unit_1_score unit_2_score unit_3_score 
#>   <int>  <int>  <int> 
#> 1   3   4   6 
#> 2   5   5   6 
#> 3   4   4   6 
#> 4   4   4   6 
#> 5   2   5   6 
#> 6   5   5   7 
#> 7   5   5   6 
#> 8   4   5   5 
#> 9   6   4   5 
#> 10   4   5   5 
#> # ... with 38 more rows 

は(vignette("tidy-evaluation")を読んでみてください)、ややトリッキーですが、それは動作します: rlangパッケージと一緒に新しい!!!拡張メソッドの仕事でsyms機能は、この種の問題を解決するためにだからそれがあります:)

実際には、文字列を使用するだけで今ではおそらくあなたは気にする必要はありませんか?

dplyr::select(d, paste0("unit_", 1:3, "_score")) 
#> # A tibble: 48 x 3 
#> unit_1_score unit_2_score unit_3_score 
#>   <int>  <int>  <int> 
#> 1   3   4   6 
#> 2   5   5   6 
#> 3   4   4   6 
#> 4   4   4   6 
#> 5   2   5   6 
#> 6   5   5   7 
#> 7   5   5   6 
#> 8   4   5   5 
#> 9   6   4   5 
#> 10   4   5   5 
#> # ... with 38 more rows 
関連する問題