2017-02-03 7 views
3

たとえば、「Q3」で始まるすべての列の合計を取得するデータフレームがありますが、それぞれを入力することができますが、このようなことを行うことができれば嬉しいです:突然変異で `dplyr`選択ヘルパー関数を使用する方法はありますか?

#Example data 
test <- structure(list(UserID = c("53017366", "53017366"), Q3_1 = c(3L, 
3L), Q3_2 = c(2L, 2L), Q3_3 = c(3L, 3L), Q3_4 = c(NA, 5L)), class = "data.frame", row.names = c(NA, -2L), .Names = c("UserID", "Q3_1", "Q3_2", "Q3_3", "Q3_4")) 

#what I'd like to see, but doesn't work 
test %>% mutate(total = sum(starts_with("Q3"), na.rm = TRUE)) 

#What I'd like to end up with: 
    UserID Q3_1 Q3_2 Q3_3 Q3_4 total 
1 53017366 3 2 3 NA  8 
2 53017366 3 2 3 5 13 

1つのオプションは、herehereの場合、データに新しい選択列全体を置き、rowwise関数(rowSumsなど)を使用する必要があります。

答えて

4

私たちは、このケースではrowSums

test %>% 
    mutate(total = rowSums(.[grep("Q3", names(.))], na.rm =TRUE)) 
# UserID Q3_1 Q3_2 Q3_3 Q3_4 total 
#1 53017366 3 2 3 NA  8 
#2 53017366 3 2 3 5 13 
+2

あなたの答えから派生した、これと同じようなものも動作します。ありがとうございます: 'test%>%mutate(total = rowSums(.start_with(" Q3 "、vars = names(。))]、na.rm = TRUE))' –

+0

そしてこの場合私は総合的な得点といくつかのサブセールス(私は何を使用するかわかりませんが)。私は '[1:3]'を選択項目に追加して、簡単に部分集合にすることができます。それはかなり簡単な方法ですが、もっと良い方法があれば、私は学習に興味があります。 –

1

を使用することができますが、janitor::add_totals_col使用することができます:ここのmutateでselectヘルパーを使用する必要についてのあなたのより深い質問に

library(janitor) 
test %>% 
    add_totals_col() 
#>  UserID Q3_1 Q3_2 Q3_3 Q3_4 Total 
#> 1 53017366 3 2 3 NA  8 
#> 2 53017366 3 2 3 5 13 

を、この必要性は、基礎となることを示すことができますtidy data構造の欠如。この場合、列見出しに値があります。変数がquarterのようにもっと整頓されたフォーマットでは、group_bysummariseを使って上品に行うことができます。

+0

その機能を知らなかった。それを提供してくれてありがとう – akrun

+0

提案をありがとう。これは調査データの一部であるため、列は異なる質問です。それはQ3_5と続きますが、最終的にはQ4_1、Q4_2にぶつかります...そのような長いデータセットは私には直感的ではありませんが、質問セットの列と質問する列それが値だった。 –

関連する問題