行の計算の種類から新しい変数を変更しようとしています。たとえば、次のように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))
これは回避策の多くですが、使用することができます
iris %>% mutate(sumVar = rowSums(.[1:4]))
コメントに書かれているように、mutate内でselect
を使用して、合計する列を取得することもできます。たとえば、
iris %>%
mutate(sumVar = rowSums(select(., contains("Sepal")))) %>%
head
または
iris %>%
mutate(sumVar = select(., contains("Sepal")) %>% rowSums()) %>%
head
より複雑な方法は次のとおりです。
iris %>% select(Sepal.Length:Petal.Width) %>%
mutate(sumVar = rowSums(.)) %>% left_join(iris)
@docendodiscimusのコメントを回答として追加します。彼に+1!
iris %>% mutate(sumVar = rowSums(select(., contains("Sepal"))))
私はこのシンプルなソリューションを使用しています。これは、Davide Passarettiによる答えをより強力に修正したものです。
iris %>% select(Sepal.Length:Petal.Width) %>%
transmute(sumVar = rowSums(.)) %>% bind_cols(iris, .)
(ただし、リモートデータセットを操作する場合を除き、行の順序を定義する必要があります。これは問題ありません。)
正規表現を使いこなす必要がある場合に備えて、contains
またはmatches
の代わりにgrepを使用することもできます(matches
はネガティブとは思えない私の経験では先読みなど)。
iris %>% mutate(sumVar = rowSums(select(., grep("Sepal", names(.)))))