簡體   English   中英

將新列添加到一個 Dataframe 基於另一個 R 中的條件的值和函數

[英]Add New Columns to One Dataframe Based on Values and Functions in Another With Conditions in R

對你來說是一個棘手的問題。 我有兩個數據框,一個是奇數比率列表(跳過第一個,因為它是我們的預測器)。 見下文:

變量的名稱 賠率
變量2 0.87
變量 3 1.42
變量4 2.10
變量5 0.56
變量6 1.01

第二個是主題列表,變量作為列,它是否以二進制標志(0/1)的形式出現。 見下文:

主題名稱 Var 1(預測器) 變量 2 變量 3 變量 4 變量 5 變量 6
1 0 1 0 0 1
1 0 0 0 1 1
大象 0 0 0 0 0 0
1 0 0 1 1 1
豺狼 0 0 0 0 0 1

我現在需要做的是通過它們的優勢比添加x個新變量(如果存在)。 例如。 Dog有 2 個當前預測變量。 Var 3Var 6所以我們想要Var3=1.42 * Var6=1.01 = 1.43 將其他的留空。 對於Jackal ,我們在Var 6=1.01中有一個預測變量,其他變量留空。 將這些作為單個變量添加,並且它們的總乘法是首選。

變量的數量可能從五個、六個或七個變化,因此為 function 指定名稱將不起作用。 它需要基於初始變量的數量(預測變量為-1)。

到目前為止,我已經嘗試編寫一個復雜的ifelse語句,但它不適用於動態范圍。 在匹配名稱中添加前綴/后綴的內容? 還是通過 position? 我真的很難以最有效的方式做到這一點。 希望很清楚,如果需要/要求,很樂意提供更多詳細信息。

讓我們假設您的第一個數據框稱為odds_df ,而您的第二個數據框稱為presence_df 我已從您的問題中獲取數據,並在此答案的底部制作了可重復的版本。

由於您的存在/不存在數據框中可能有不同數量的代表變量的列,您將需要某種方法來確定您嘗試將哪些列與您的賠率數據匹配。 在您的示例數據中,這可能是根據變量名稱,使用字符串匹配:

var_cols <- grep("^Var\\d+$", names(presence_df))

或者只是根據您知道哪些列是感興趣的列:

var_cols <- 3:7

或者,如果前兩列始終是名稱和因變量,那么更通用的解決方案是:

var_cols <- 3:ncol(presence_df)

在這種情況下,這三種生成var_cols的方法中的任何一種都會為您提供向量c(3, 4, 5, 6, 7)

您現在需要知道哪些賠率適用於哪些列,因此我們將存在/缺席數據框的列與賠率數據框中的正確行match ,如下所示:

var_rows <- match(names(presence_df)[var_cols], odds_df$`Variable Name`)

現在我們在 position 中獲取我們需要應用於列的賠率向量:

odds_vec <- odds_df$Odds[var_rows]

為了獲得應該適用於每個條目的正確賠率(給定存在或不存在),我們需要記住,由於賠率是乘法的,因此任何不存在的變量都應該被賦予值 1,而不是 0,這樣它就不會影響賠率計算. 這意味着我們應該將存在/缺席數據的每一行乘以對數賠率,並對結果取冪以獲得實際賠率。

我們可以使用apply逐行執行此操作:

res <- t(apply(presence_df[var_cols], 1, function(x) exp(x * log(odds_vec))))

res
#>      Var2 Var3 Var4 Var5 Var6
#> [1,]    1 1.42  1.0 1.00 1.01
#> [2,]    1 1.00  1.0 0.56 1.01
#> [3,]    1 1.00  1.0 1.00 1.00
#> [4,]    1 1.00  2.1 0.56 1.01
#> [5,]    1 1.00  1.0 1.00 1.01

現在我們可以將它寫回到我們的存在/不存在數據框中,如下所示:

presence_df[var_cols] <- res

presence_df
#>   Subject Name Var 1 (Predictor) Var2 Var3 Var4 Var5 Var6
#> 1          Dog                 1    1 1.42  1.0 1.00 1.01
#> 2          Cat                 1    1 1.00  1.0 0.56 1.01
#> 3     Elephant                 0    1 1.00  1.0 1.00 1.00
#> 4         Bear                 1    1 1.00  2.1 0.56 1.01
#> 5       Jackal                 0    1 1.00  1.0 1.00 1.01

最后一步是計算存在或不存在變量所隱含的幾率,這只是這些幾率的逐行乘積:

presence_df$odds <- apply(presence_df[var_cols], 1, prod)

presence_df
#>   Subject Name Var 1 (Predictor) Var2 Var3 Var4 Var5 Var6    odds
#> 1          Dog                 1    1 1.42  1.0 1.00 1.01 1.43420
#> 2          Cat                 1    1 1.00  1.0 0.56 1.01 0.56560
#> 3     Elephant                 0    1 1.00  1.0 1.00 1.00 1.00000
#> 4         Bear                 1    1 1.00  2.1 0.56 1.01 1.18776
#> 5       Jackal                 0    1 1.00  1.0 1.00 1.01 1.01000

將幾率轉換為概率也可能會有所幫助,這樣我們就可以在給定預測變量的情況下看到因變量存在的概率:

presence_df$prob <- presence_df$odds / (1 + presence_df$odds)

presence_df
#>   Subject Name Var 1 (Predictor) Var2 Var3 Var4 Var5 Var6    odds      prob
#> 1          Dog                 1    1 1.42  1.0 1.00 1.01 1.43420 0.5891874
#> 2          Cat                 1    1 1.00  1.0 0.56 1.01 0.56560 0.3612672
#> 3     Elephant                 0    1 1.00  1.0 1.00 1.00 1.00000 0.5000000
#> 4         Bear                 1    1 1.00  2.1 0.56 1.01 1.18776 0.5429115
#> 5       Jackal                 0    1 1.00  1.0 1.00 1.01 1.01000 0.5024876

** 來自問題的數據以可重復的格式 **

odds_df <- structure(list(`Variable Name` = c("Var2", "Var3", "Var4", "Var5", 
"Var6"), Odds = c(0.87, 1.42, 2.1, 0.56, 1.01)), row.names = c(NA, 
-5L), class = "data.frame")

presence_df <- structure(list(`Subject Name` = c("Dog", "Cat", "Elephant", 
"Bear", "Jackal"), `Var 1 (Predictor)` = c(1L, 1L, 0L, 1L, 0L), Var2 = c(0L, 
0L, 0L, 0L, 0L), Var3 = c(1L, 0L, 0L, 0L, 0L), Var4 = c(0L, 0L, 
0L, 1L, 0L), Var5 = c(0L, 1L, 0L, 1L, 0L), Var6 = c(1L, 1L, 0L, 
1L, 1L)), class = "data.frame", row.names = c(NA, -5L))

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM