<jupyter_start><jupyter_text>このページ https://github.com/tidyverse/dplyr/issues/4544 のデータを例にQで始まる列の和を求めるコードをいくつか紹介する。<jupyter_code>QIMU_raw <- data.frame(
  ID = c(1L, 2L, 3L, 4L, 5L, 6L),
  Age = c(25L, 20L, 23L, 29L, 24L, 27L),
  Q1 = c(-0.49, -0.08, -2.01, 1, 0.27, -0.45),
  Q2 = c(0.4, 0.71, -0.77, 0.88, -1.92, -0.48),
  Q3 = c(0.53, 0.71, -1.02, -0.09, 0.17, -0.31),
  Q4 = c(-0.47, -0.51, -2.27, -0.26, -1.35, -1.45),
  Q5 = c(-0.44, 0.64, -1.05, 0.8, 0.83, 0.01),
  Q6 = c(-1.02, -0.02, -1.57, 0.07, -0.52, -0.9),
  Sex = as.factor(c("F", "F", "F", "F", "M", "M"))
)
QIMU_raw<jupyter_output><empty_output><jupyter_text>このデータに対して、Q1からQ6までの列の和を求めて、Q_totalという列を作るのを目標とする！ Q1からQ6までしか列がなければ、apply()で簡単に書ける。第２引数の1で行方向の操作であることを指定している。<jupyter_code>QIMU_raw %>% 
  select(Q1:Q6) %>%
  mutate(Q_total = apply(., 1, sum))<jupyter_output><empty_output><jupyter_text>しかし、Qで始まる列以外も残したいときはどうするか？<jupyter_code>QIMU_raw %>% 
  mutate(Q_total = apply(select(., Q1:Q6), 1, sum))<jupyter_output><empty_output><jupyter_text>select()の列選択をstarts_with()などにするとより応用が広がる<jupyter_code>QIMU_raw %>% 
  mutate(Q_total = apply(select(., starts_with("Q")), 1, sum))<jupyter_output><empty_output><jupyter_text>apply()とsum()の組み合わせの代わりに、rowSums()を使うこともできる<jupyter_code>QIMU_raw %>% 
  select(Q1:Q6) %>%  
  mutate(Q_total = rowSums(.))<jupyter_output><empty_output><jupyter_text>Qで始まる以外の列も残したまま同じことを実現するには？<jupyter_code>QIMU_raw %>% 
  mutate(Q_total = rowSums(select(., Q1:Q6)))
QIMU_raw %>% 
  mutate(Q_total = rowSums(select(., starts_with("Q"))))<jupyter_output><empty_output><jupyter_text>さらに、よりモダンなtidyverse-likeな書き方も見てみよう 複数の列に対して操作を実現するacross()を使ってみよう<jupyter_code>QIMU_raw %>%
  mutate(Q_total = rowSums(across(Q1:Q6)))
QIMU_raw %>%
  mutate(Q_total = rowSums(across(starts_with("Q"))))<jupyter_output><empty_output><jupyter_text>across()の詳しい説明は https://dplyr.tidyverse.org/reference/across.html （ただし、詳しすぎて混乱するかも） また、行方向に操作することを明示的に行うrowwise()と組み合わせることもできる。さらに、c_across()で列の範囲を指定できる。<jupyter_code>QIMU_raw %>% 
  rowwise() %>%
  mutate(Q_total = sum(c_across(Q1:Q6)))<jupyter_output><empty_output><jupyter_text>この場合は、rowSums()ではなく、sum()になっていることに注意しよう。なぜなら、rowwise()ですでに行方向に操作をすることは指定済みのため。 rowwise()の詳しい説明はここ https://dplyr.tidyverse.org/articles/rowwise.html さらに発展編として、purrrパッケージのpmap_***()を使って実現することもできる。<jupyter_code>QIMU_raw %>% 
  mutate(Q_total = pmap_dbl(select(., starts_with("Q")), sum))<jupyter_output><empty_output>
{'fraction_non_alphanumeric': 0.19451371571072318, 'fraction_numerical': 0.06317539484621779, 'mean_word_length': 7.2714776632302405, 'pattern_counts': {'":': 0, '<': 38, '<?xml version=': 0, '>': 50, 'https://': 3, 'lorem ipsum': 0, 'www.': 0, 'xml': 0}, 'pii_count': 0, 'substrings_counts': 0, 'word_list_counts': {'cursed_substrings.json': 1, 'profanity_word_list.json': 0, 'sexual_word_list.json': 0, 'zh_pornsignals.json': 0}}
{'chain_length': '9', 'dir': 'jupyter-structured-clean-dedup', 'id': '483169', 'license': 'MIT', 'n_tokens_mistral': 1526, 'n_tokens_neox': 1389, 'n_words': 113, 'path': 'mutate_row_wise_operation_R.ipynb', 'repo_name': 'fronori/Rwrangling', 'size': '2406'}