今天是個好日子
拿這個資料集:
df <- tibble(
id = 1:1000,
smoking = sample(c(TRUE, FALSE), length(id), prob = c(0.2,0.8), replace = TRUE),
age = rnorm(length(id), mean = 60, sd = 10)
)
我想向lung_cancer資料框中添加另一個邏輯變數,其中TRUEorFALSE是通過基于患者smoking和age狀態計算的概率分布分配的
我知道這需要回圈遍歷每個索引,我可以設法使用For()回圈來做到這一點,所以我寫了以下內容:
df$lung_cancer <- vector("logical", length(id))
for (i in seq_along(df$lung_cancer)) {
df$lung_cancer[[i]] = if_else(df$age[[i]] > 50, case_when(
df$age[[i]] > 50 & df$smoking[[i]] == TRUE ~ sample(c(TRUE, FALSE), 1, prob = c(0.05, 0.95)),
df$age[[i]] > 50 & df$smoking[[i]] == FALSE ~ sample(c(TRUE, FALSE), 1, prob = c(0.001, 0.999))
), FALSE
)
}
現在我發現這太冗長了,有沒有什么簡潔的方法可以用mutate()函式和purrr包或任何其他方式(最好從tidyverse包集合)來撰寫它?
uj5u.com熱心網友回復:
該case_when()函式應該是您所需要的,但它似乎不會為每個 TRUE 事件重新評估。
這是一個簡單的基本 R 解決方案,它利用了 R 的矢量化能力(從而避免了回圈)。
#set all to the default value
df$lung_cancer<-FALSE
#perform the selections and then set to new value
df$lung_cancer[df$age > 50 & df$smoking == TRUE ] <- sample(c(TRUE, FALSE), nrow(df), prob = c(0.05, 0.95), replace = TRUE)[df$age > 50 & df$smoking == TRUE ]
df$lung_cancer[df$age > 50 & df$smoking == FALSE] <- sample(c(TRUE, FALSE), nrow(df), prob = c(0.001, 0.999), replace = TRUE)[df$age > 50 & df$smoking == FALSE]
Case_when() 問題
要使用 case_when 定義默認值,作為您的最后一個測驗,請定義一個 TRUE 陳述句。例如在這個例子中:
case_when (
df$age> 50 & df$smoking == TRUE ~ "Group1",
df$age > 50 & df$smoking == FALSE ~ "Group2",
TRUE ~ "Everyone Else"
)
查看?case_when更多示例
uj5u.com熱心網友回復:
data.table允許您改變列的一部分。這樣,樣本只能生成兩次而不是 1000 次。
library(data.table)
set.seed(42)
df <- data.table(
id = 1:1000,
smoking = sample(c(TRUE, FALSE), length(id), prob = c(0.2,0.8), replace = TRUE),
age = rnorm(length(id), mean = 60, sd = 10)
) %>%
.[, lung_cancer := FALSE] %>%
.[age > 50 & smoking, lung_cancer := sample(c(TRUE, FALSE), .N, prob = c(0.05, 0.95), replace = TRUE)] %>%
.[age > 50 & !smoking, lung_cancer := sample(c(TRUE, FALSE), .N, prob = c(0.001, 0.999), replace = TRUE)] %>%
.[]
df[, .(.N, lc = sum(lung_cancer)), keyby = smoking]
smoking N lc
1: FALSE 804 2
2: TRUE 196 5
我在最后放了一個“報告”。
(setDT()如有必要,您可以將您的 tibble 轉換為 data.table )
轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/343073.html
上一篇:回圈遍歷bashscript中的檔案名-需要在每個回圈第n次迭代中更新檔案中的一行文本,使用n 1但回圈序列會導致問題
