カスタムRコマンドでグループごとに「特定の年月の値の差」を計算しようとしたところ、一部のグループでmust be size 1, not 0 のエラーが発生した時の原因と対処法を紹介します。
例えば、グループごとに、2025-04 と 2024-10 の測定値の差を求めるために以下のようなRスクリプトを使っていたとします。
group_by(`センサーID`) %>%
mutate(`測定値差(2025-04 minus 2024-10)` =
`測定値`[`測定年月` == "2025-04"] -
`測定値`[`測定年月` == "2024-10"]) %>%
ungroup()
これを実行した際に、以下のようなエラーが発生することがあります。
! `測定値差(2025-04 minus 2024-10)` must be size 1, not 0.
ℹ In group 4: `センサーID = "S004"`.

このエラーの原因は、エラーになったグループ(センサーID = “S004”)には、測定年月 == "2025-04" または 測定年月 == "2024-10" に該当する行が存在しないことが原因です。
[測定年月 == "2025-04"] のような絞り込みの書き方は、該当する行が無いと「長さ0」の結果を返します。mutate はグループの各行に対して長さ1の値を期待するため、長さ0が返ると must be size 1, not 0 というエラーになります。
特に、一部のグループだけ年月のデータが揃っていない場合に起こりやすいです。
対処法として、差分のを求める際の各値を first() で囲みます。
group_by(`センサーID`) %>%
mutate(`測定値差` =
first(`測定値`[`測定年月` == "2025-04"]) -
first(`測定値`[`測定年月` == "2024-10"])) %>%
ungroup()

first() は、該当する行が無いグループでは欠損値(NA)を返します。
これにより値の長さが必ず1に保たれるため、データが揃っていないグループがあってもエラーにならず実行できます。