我有一個資料框df,對于每一列,我想計算另一列中出現的比例。每行事件都有一個權重,所以理想情況下我想獲得一個加權份額。
A <- c(0, 1, 0, 0, 1, 0, 1, 1, 1, 0)
B <- c(0, 1, 0, 1, 1, 0, 0, 0, 0, 0)
C <- c(0, 0, 0, 1, 1, 0, 0, 0, 0, 1)
D <- c(1, 0, 0, 1, 1, 0, 0, 0, 0, 0)
weight <- c(0.5, 1, 0.2, 0.3, 1.4, 1.5, 0.8, 1.2, 1, 0.9)
df <- data.frame(A, B, C, D, weight)
我試圖以這種方式為每對列計算它:
#total weight of occurences in A
wgt_A <- df%>%
filter(A == 1)%>%
summarise(weight_A = sum(weight))%>%
select(weight_A)
#weighted share of occurrences in A that also occur in B
wgt_A_B <- df%>%
filter(A == 1, B == 1)%>%
summarise(weight_A_B = sum(weight))%>%
select(weight_A_B)
Result_1 <- wgt_A_B / wgt_A
對于 4 列的所有組合,我希望最終得到六個結果。但是,為此我需要多次復制這個 dplyr 管道,而我的實際資料集有 20 多個這樣的列。是否有更有效/更快的方法可以使用 apply/sapply 或某種回圈來執行此操作,我還可以在其中選擇要執行此操作的列?
我是 R 和 stackoverflow 的新手,所以如果我在做/說什么愚蠢的話,請告訴我(并原諒我)
uj5u.com熱心網友回復:
我們可以combn用來做組合base R
out <- combn(df[1:4], 2, FUN = function(x)
sum(df$weight[x[[1]] & x[[2]]])/ sum(df$weight[as.logical(x[[1]])]) )
names(out) <- combn(names(df)[1:4], 2, FUN = paste, collapse = "_")
-輸出
> out
A_B A_C A_D B_C B_D C_D
0.4444444 0.2592593 0.2592593 0.6296296 0.6296296 0.6538462
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/410078.html
標籤:
