web-dev-qa-db-ja.com

dplyr mutate rowSums計算またはカスタム関数

行の計算の種類から新しい変数を変更しようとしています。たとえば、次のようにrowSums

iris %>% 
  mutate_(sumVar = 
            iris %>% 
            select(Sepal.Length:Petal.Width) %>%
            rowSums)

その結果、「sumVar」は最初の値(10.2)に切り捨てられます。

Source: local data frame [150 x 6]
Groups: <by row>

   Sepal.Length Sepal.Width Petal.Length Petal.Width Species sumVar
1           5.1         3.5          1.4         0.2  setosa   10.2
2           4.9         3.0          1.4         0.2  setosa   10.2
3           4.7         3.2          1.3         0.2  setosa   10.2
4           4.6         3.1          1.5         0.2  setosa   10.2
5           5.0         3.6          1.4         0.2  setosa   10.2
6           5.4         3.9          1.7         0.4  setosa   10.2
..
Warning message:
Truncating vector to length 1 

rowwiseを適用する必要がありますか?または、この種の計算で使用する正しい動詞は何ですか。

編集:

より具体的には、dplyrを使用してインラインカスタム関数を実現する方法はありますか?

私はそれが可能かどうか疑問に思っています:

iris %>% 
  mutate(sumVar = colsum_function(Sepal.Length:Petal.Width))
53
leoluyi

これは回避策の多くですが、使用することができます

iris %>% mutate(sumVar = rowSums(.[1:4]))

コメントに書かれているように、mutate内でselectを使用して、合計する列を取得することもできます。たとえば、

iris %>% 
  mutate(sumVar = rowSums(select(., contains("Sepal")))) %>% 
  head 

または

iris %>% 
  mutate(sumVar = select(., contains("Sepal")) %>% rowSums()) %>% 
  head
100

より複雑な方法は次のとおりです。

 iris %>% select(Sepal.Length:Petal.Width) %>%
mutate(sumVar = rowSums(.)) %>% left_join(iris)
12

@docendodiscimusのコメントを回答として追加します。彼に+1!

iris %>% mutate(sumVar = rowSums(select(., contains("Sepal"))))
5
psychonomics

私はこのシンプルなソリューションを使用しています。これは、Davide Passarettiによる答えをより強力に修正したものです。

iris %>% select(Sepal.Length:Petal.Width) %>%
  transmute(sumVar = rowSums(.)) %>% bind_cols(iris, .)

(ただし、リモートデータセットを操作する場合を除き、行の順序を定義する必要があります。これは問題ありません。)

1
Melkor.cz

正規表現を使いこなす必要がある場合に備えて、containsまたはmatchesの代わりにgrepを使用することもできます(matchesはネガティブとは思えない私の経験では先読みなど)。

iris %>% mutate(sumVar = rowSums(select(., grep("Sepal", names(.)))))
1
llewmills