R付配管
配管とは何ですか?
配管はチェーンとも呼ばれます。
R では、パイプ演算子 ( %>%) を使用して、ある演算の結果を入力として別の演算に渡します。これは Tidyverse パッケージの一部であり、より読みやすく簡潔なコードを作成するために使用されます。
パイプ演算子を使用すると、ネストされた関数呼び出しよりも読みやすく理解しやすい方法で複数の操作を連鎖させることができます。これにより、コードがより簡潔になり、保守が容易になります。
パイプ/チェーンを使用する理由
パイプまたはチェーンはプログラミングで使用され、簡潔で読みやすい方法でデータの一部に対して複数の操作を実行できるようにします。パイプ演算子またはその他の構文を使用して複数の操作を連鎖させることにより、複数の関数呼び出しをネストしたり、複数行のコードを記述したりすることなく、複雑なタスクをより線形でわかりやすい方法で表現できます。
パイプとチェーンは、データ操作や分析のタスクで特に役立ちます。これらのタスクでは、分析や視覚化の準備のためにデータセットに一連の操作を適用する必要があることがよくあります。これらにより、コードがよりモジュール化され、保守が容易になり、操作のさまざまな組み合わせをより迅速に記述してテストできるため、生産性が向上します。
全体として、パイプとチェーンは、より読みやすく、モジュール化された柔軟なコードを作成するための便利なツールであり、複雑な問題をより深く理解し、解決するのに役立ちます。
パイプ演算子は、シンプルかつエレガントな方法で関数にパラメータを渡すために使用されます。これにより、コーダーは中間値を排除し、関数呼び出しを読みやすくすることができます。
配管するメリットはあるのでしょうか?
パイプ演算子を使用すると、次のような利点があります。
- 可読性の向上: パイプ演算子を使用すると、複雑な演算をより簡潔かつ直線的な方法で表現できるため、コードがより読みやすくなります。また、コードを理解しにくくする可能性がある関数呼び出しの深いネストを回避するのにも役立ちます。
- モジュール性の向上: パイプ演算子を使用して、さまざまな方法で簡単に組み合わせてさまざまなタスクを実行できる再利用可能なコード ブロックを構築できます。これにより、コードがよりモジュール化され、保守が容易になります。
- コラボレーションの強化: パイプ演算子は、R コミュニティで広く使用されている馴染みのあるツールであり、これをコードで使用すると、他の人が理解しやすくなり、あなたの作業に貢献しやすくなります。
- 柔軟性の向上: パイプ演算子を使用すると、コードの大部分を書き直すことなく、コードのさまざまなコンポーネントを簡単に交換し、さまざまな操作の組み合わせを試すことができます。これにより時間を節約し、分析の実験と反復が容易になります。
パイプ演算子は、次のような多くのプログラミング言語で使用されます。
- Unix シェル (bash など): Unix シェルでは、パイプ演算子 (
|) を使用して、あるコマンドの出力を別のコマンドの入力としてリダイレクトします。たとえば、このコマンドはls -l | grep "^d"現在のディレクトリ内のディレクトリを一覧表示します。 - R: R では、パイプ演算子 (
%>%) を使用して、ある演算の結果を入力として別の演算に渡します。これは Tidyverse パッケージの一部であり、より読みやすく簡潔なコードを作成するために使用されます。 - Elixir: Elixir では、パイプ演算子 (
|>) を使用して、ある関数の結果を入力として別の関数に渡します。これは R パイプ演算子に似ています。 - F#: F# では、パイプ演算子 (
|>) を使用して、ある関数の結果を入力として別の関数に渡します。これは、Elixir および R パイプ オペレーターに似ています。 - PowerShell: PowerShell では、パイプライン演算子 (
|) を使用して、あるコマンドの出力を別のコマンドの入力として渡します。これは Unix のパイプ演算子に似ています。 - Julia では、パイプ演算子 (
|>) を使用して、ある関数の結果を入力として別の関数に渡します。これは、R、Elixir、F# などの他の言語で使用されるパイプ演算子に似ています。
パイプの種類
プログラミングで使用されるパイプにはいくつかの種類があります。
- データ パイプ: これらのパイプは、あるコマンドまたは関数の出力を別のコマンドまたは関数の入力として渡すために使用されます。これらは、Unix シェル (bash など) やパイプ演算子を持つプログラミング言語 (R や Elixir など) で一般的に使用されます。
- リダイレクト パイプ: これらのパイプは、コマンドまたは関数の出力をファイルまたは別の場所にリダイレクトするために使用されます。これらは、Unix シェル (bash など) やリダイレクト演算子を持つプログラミング言語 (PowerShell など) で一般的に使用されます。
- 条件付きパイプ: これらのパイプは、特定の条件が満たされた場合にのみ、コマンドまたは関数の出力を別のコマンドまたは関数に渡すために使用されます。これらは、Unix シェル (bash など) や条件演算子を持つプログラミング言語 (PowerShell など) でよく使用されます。
- メッセージ受け渡しパイプ: これらのパイプは、プロセスまたはスレッド間でメッセージまたはデータを渡すために使用されます。これらは、プログラムの異なる部分が相互に通信できるようにするために、並行プログラミング言語で一般的に使用されます。
- フォワード パイプは、ある関数の出力を別の関数の入力として渡すパイプ演算子の一種です。出力が関数のチェーンを逆方向ではなく順方向に流れるため、これらは「順方向」パイプと呼ばれます。
- R では、
%>%演算子はフォワード パイプ演算子です。これは、ある操作の結果を最初の引数として別の操作に渡すために使用されます。例えば:
転送パイプは、データ操作と分析のための R パッケージのコレクションである Tidyverse のコンテキストで特に役立ちます。
R の「フィードフォワード パイプ」は、中間結果を変数に代入せずに、ある関数の出力を入力として別の関数に渡す方法です。これは、演算子を使用して行われます%$%。この演算子は、演算子と似ています%>%が、演算子の右側への入力を、最初の引数としてではなく、左側の関数の引数として渡します。
Juliaには、入力を最後の引数ではなく最初の引数として関数に渡すために使用できる「逆方向パイプ」演算子 ( ) もあります。<|これは、入力を最後の引数ではなく最初の引数として期待する関数に入力を渡したい場合に便利です。
全体として、パイプ演算子は、Julia でより読みやすく簡潔なコードを作成するための便利なツールとなります。
いくつかの例を見てみましょう。
url='https://raw.githubusercontent.com/NicJC/Country-Sales/main/Country_Sales.csv'
data <- read_csv(url,show_col_types = FALSE)
data %>%
head(10)
image by author
url='https://raw.githubusercontent.com/NicJC/Country-Sales/main/Country_Sales.csv'
data <- read_csv(url,show_col_types = FALSE)
data %>%
head(10) %>%
select(c(1,2,3,6,7))
image by author
データ フレームにパラメータを渡す前にデータ フレームの上位 10 行をリストしたため、作業するのは最初の 10 行のみになります。これは、上のビジュアルからわかるように、
10 行中 1 ~ 10
data %>%
select(c(1,2,3,6,7)) %>%
rename(Units_Sold = 'Units Sold',Item_Type = 'Item Type',Order_Date = 'Order Date')
image by author
data %>%
select(c(1,2,3,6,7)) %>%
rename(Units_Sold = 'Units Sold',Item_Type = 'Item Type',Order_Date = 'Order Date') %>%
filter(Country == "Australia" & Item_Type != ("Vegetables"))
image by author
割り当ての「==」と除外の「!=」に注意してください。
ここで、いくつかの集計とグループ化を追加できるようになりました。
data %>%
select(c(1,2,3,6,7)) %>%
rename(Units_Sold = 'Units Sold',Item_Type = 'Item Type',Order_Date = 'Order Date') %>%
filter(Country == "Australia" & Item_Type != ("Vegetables")) %>%
group_by(Item_Type, Year) %>%
summarise(Avg_Sales = mean(Units_Sold))
image by author
data %>%
select(c(1,2,3,6,7)) %>%
rename(Units_Sold = 'Units Sold',Item_Type = 'Item Type',Order_Date = 'Order Date') %>%
filter(Country == "Australia" & Item_Type != ("Vegetables")) %>%
group_by(Item_Type, Year) %>%
summarise(Avg_Sales = mean(Units_Sold)) %>%
ggplot() +
geom_point(mapping = aes(x = Year , Avg_Sales , col = Item_Type)) +
labs( title = "Average sales by item", subtitle = "Australian Sales" ,
col = "Item Type" , y = "Average sales" , caption = "Vegetables excluded from sales")
この操作されたデータをすべて新しいデータフレームに割り当てることができるため、時間を節約できるはずです:-
df <- データ
これにより、元のデータフレーム内のデータにアクセスできなくなります。
これは、操作されたデータのみを保持したい場合に役立ちます。
df <- data %>%
select(c(1,2,3,6,7)) %>%
rename(Units_Sold = 'Units Sold',Item_Type = 'Item Type',Order_Date = 'Order Date') %>%
filter(Country == "Australia" & Item_Type != ("Vegetables")) %>%
group_by(Item_Type, Year) %>%
summarise(Avg_Sales = mean(Units_Sold))
df
image by author
データサイエンスのRより
パイプは強力なツールですが、自由に使える唯一のツールではなく、すべての問題を解決できるわけではありません。パイプは、かなり短い線形の一連の操作を書き直す場合に最も役立ちます。次のような場合には、別のツールを使用する必要があると思います。
- パイプは(たとえば)10 段よりも長いです。その場合は、意味のある名前を付けて中間オブジェクトを作成します。これにより、中間結果をより簡単に確認できるため、デバッグが容易になります。また、変数名が意図の伝達に役立つため、コードを理解しやすくなります。
- 複数の入力または出力があります。変換されるプライマリ オブジェクトが 1 つではなく、2 つ以上のオブジェクトが結合される場合は、パイプを使用しないでください。
- あなたは、複雑な依存構造を持つ有向グラフについて考え始めています。パイプは基本的に線形であり、パイプとの複雑な関係を表現すると、通常、混乱を招くコードが生成されます。
さまざまなプログラミング言語で多数の異なるパイプ演算子が使用されており、それぞれに独自の機能セットが備わっています。
パイプの操作に慣れるまでには時間がかかるかもしれませんが、パイプを使用すると次のような多くの利点があります。
- 可読性の向上
- 柔軟性
- デバッグが容易になる
- モジュール性
パイプの概念はプログラミングに固有のものではなく、数学と工学において長い歴史があります。数学的な文脈では、パイプは流体 (水やガスなど) をある場所から別の場所に輸送するために使用されるデバイスです。パイプは一般に、相互接続されたチャネルまたはチューブのシステムを通して流体を運ぶために使用され、多くの場合、あるステージから次のステージへの流体の流れと圧力を制御するために使用されます。
記事をお楽しみいただければ幸いです。
データのパイプと操作に関する私の記事をチェックしてください。
R を使用してデータをパイプする — パート 1Linkedinまたはgithubに接続しましょう

![とにかく、リンクリストとは何ですか?[パート1]](https://post.nghiatu.com/assets/images/m/max/724/1*Xokk6XOjWyIGCBujkJsCzQ.jpeg)



































