さまざまなデータセットを操作する関数を作成しようとしていますが、このタスクでいくつかの問題に直面しています。以下の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日間これに取り組んできましたが、この現象に関する情報を見つけることができず、頭を抱えていると推測しています。
この関数の最終的な目標は次のとおりです。
total
変数を計算します(A:Dの合計)prob
4つの変数(つまり、A /合計、B /合計など)を出力する変数を計算します。prob
すべて無限大値(即ち、「Infを」)が0に再符号化するように可変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]
コメントを追加