dplyrの%>%パイプを使用して複数のR変数を操作できるR関数を作成するにはどうすればよいですか?

Bear25

さまざまなデータセットを操作する関数を作成しようとしていますが、このタスクでいくつかの問題に直面しています。以下のdput()出力で操作しようとしているデータの簡略化されたバージョンを提供しています。

structure(list(id = structure(c(2, 4, 6, 8, 10), label = "iid", format.spss = "F4.0", display_width = 0L), A = c(13, 9, 14, 14, 13), B = c(12, 0, 9, 3, 10), C = c(13, 8, 14, 13, 11)), row.names = c(NA, -5L), class = c("tbl_df", "tbl", "data.frame"))

私がやろうとしていることはいくつかありますが、データのフォーマット方法が原因で、さまざまな場面で立ち往生しています。まず、各行の列A:Dの値を合計して、という変数にする必要がありますtotal次に、列A:Dのそれぞれをで除算して確率を計算する必要がありますtotal

ここで私はいくつかの問題に直面しています。上記を実行する関数を作成しました。

functa <- function(x, id, vars) {
  
  x %>%
    mutate(total = rowSums(.[vars])) %>%
    mutate(prob = .[vars]/total)

}

次の行を使用して関数を呼び出すと:

test <- functa(df_ED, "pid", c("A", "B", "C", "D"))

5つの観測値を持つオブジェクトを取得しますが、変数は7つだけです(10ではありません)。オブジェクトを調べると、4つの新しい変数(つまり、prob.A、prob.B、prob.C、prob。D)が表示されますが、それらは単一の変数として読み込まれます。

このため、このデータセットに対して実行したい後続の操作は、意図したとおりに続行できません。私は過去2日間これに取り組んできましたが、この現象に関する情報を見つけることができず、頭を抱えていると推測しています。

この関数の最終的な目標は次のとおりです。

  1. total変数を計算します(A:Dの合計)
  2. prob4つの変数(つまり、A /合計、B /合計など)を出力する変数を計算します。
  3. リコードのprobすべて無限大値(即ち、「Infを」)が0に再符号化するように可変
  4. 4つのprob変数すべてを1つの変数に合計しtotalprobます

これについての洞察をいただければ幸いです。

ロナックシャー

関数を複数の列に適用する場合は、次を使用しますacross

library(dplyr)

functa <- function(x, id, vars) {
  
  x %>%
           #sum all vars column
    mutate(total = rowSums(.[vars]),
           #Divide vars column with total and create new columns with prob
           across(all_of(vars), ~./total, .names = '{col}_prob'), 
           #Replace infinite value in prob column with 0
           across(ends_with('_prob'), ~replace(., is.infinite(.), 0))) %>%
           #Sum all prob columns. 
    mutate(totalprob = rowSums(select(., ends_with('prob'))))      
  
}

functa(df_ED, "pid", c("A", "B", "C"))

#     id     A     B     C total A_prob B_prob C_prob totalprob
#  <dbl> <dbl> <dbl> <dbl> <dbl>  <dbl>  <dbl>  <dbl>     <dbl>
#1     2    13    12    13    38  0.342  0.316  0.342         1
#2     4     9     0     8    17  0.529  0      0.471         1
#3     6    14     9    14    37  0.378  0.243  0.378         1
#4     8    14     3    13    30  0.467  0.1    0.433         1
#5    10    13    10    11    34  0.382  0.294  0.324         1

この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。

侵害の場合は、連絡してください[email protected]

編集
0

コメントを追加

0

関連記事

Related 関連記事

ホットタグ

アーカイブ