我有一個如下所示的資料集:
Study_ID Gender SMI BMI
1 100 Male 45 19
2 200 Male 50 20
3 300 Female 60 25
4 400 Male 42 29
5 500 Female 38 32
6 600 Female 50 20
7 700 Male 35 29
8 800 Male 47 31
9 900 Female 65 25
我想創建一個名為“肌肉減少癥”的新二元變數,其中患者必須滿足某些標準才能定義為“是”肌肉減少癥或“否”肌肉減少癥。男性和女性的標準不同。
我想要的輸出看起來像這樣:
Study_ID Gender SMI BMI Sarcopenia
1 100 Male 45 19 No
2 200 Male 50 20 No
3 300 Female 60 25 No
4 400 Male 42 29 Yes
5 500 Female 38 32 No
6 600 Female 50 20 Yes
7 700 Male 35 29 No
8 800 Male 47 31 Yes
9 900 Female 65 25 No
我試圖創建一個 if else 階梯:
data$Sarcopenia<-
if (data$`SMI` < 41 & data$Gender == "Female") {
"Yes"
} else if (data$`SMI` < 53 & data$Gender == "Male" & data$BMI >= 25) {
"Yes"
} else if (data$`SMI` < 43 & data$Gender == "Male" & data$BMI < 25) {
"Yes"
} else {
"No"
}
但出于某種原因,它給了我“不”,對于每個病人(即使我知道他們中的一些人符合標準)。
我可能做錯了什么?
可重現的資料:
data<-data.frame(Study_ID=c("100","200","300","400","500","600","700","800","900"),Gender=c("Male","Male","Female","Male","Female","Female","Male","Male","Female"),SMI=c("45","50","60","42","38","50","35","47","65"),BMI=c("19","20","25","29","32","20","29","31","25"))
uj5u.com熱心網友回復:
運行您的嘗試時,R 會產生警告:the condition has length > 1 and only the first element will be used.
這是因為data$SMI < 41 & data$Gender == "Female"回傳一個包含TRUE或FALSE為資料集中每個人的向量:
> data$SMI < 41 & data$Gender == "Female"
[1] FALSE FALSE FALSE FALSE TRUE FALSE FALSE FALSE FALSE
在 R 中,if不是矢量化的,所以它不理解這個輸入,只使用向量的第一個元素(在你的情況下FALSE)并忽略其余部分。這就是為什么你對每個人都看到“不”。
有一個不同的函式ifelse是矢量化的,如果你使用它就可以正常作業:
data = data.frame(Study_ID = 100*1:9,
Gender = c('Male', 'Male', 'Female', 'Male', 'Female', 'Female', 'Male', 'Male', 'Female'),
SMI = c(45, 50, 60,42,38,50,35,47,65),
BMI = c(19, 20, 25, 29, 32, 20, 29, 31, 25))
data$Sarcopenia<-
ifelse(data$`SMI` < 41 & data$Gender == "Female", "Yes",
ifelse(data$`SMI` < 53 & data$Gender == "Male" & data$BMI >= 25, "Yes",
ifelse(data$`SMI` < 43 & data$Gender == "Male" & data$BMI < 25, "Yes", "No")))
data
Study_ID Gender SMI BMI Sarcopenia
1 100 Male 45 19 No
2 200 Male 50 20 No
3 300 Female 60 25 No
4 400 Male 42 29 Yes
5 500 Female 38 32 Yes
6 600 Female 50 20 No
7 700 Male 35 29 Yes
8 800 Male 47 31 Yes
9 900 Female 65 25 No
uj5u.com熱心網友回復:
library(dplyr)
data$Sarcopenia <-
case_when(data$`SMI` < 41 & data$Gender == "Female" ~ "Yes",
data$`SMI` < 53 & data$Gender == "Male" & data$BMI >= 25 ~ "Yes",
data$`SMI` < 43 & data$Gender == "Male" & data$BMI < 25 ~ "Yes",
TRUE ~ "No")
或者不dplyr使用ifelse(但這并不是一個真正的 if-else 階梯,而且絕對不那么可讀)
data$Sarcopenia <-
ifelse((data$`SMI` < 41 & data$Gender == "Female") |
(data$`SMI` < 53 & data$Gender == "Male" & data$BMI >= 25) |
(data$`SMI` < 43 & data$Gender == "Male" & data$BMI < 25), "Yes", "No")
uj5u.com熱心網友回復:
您應該使用矢量化ifelse()而不是if...else....
transform(data,
Sarcopenia = ifelse(Gender == "Female" & SMI < 41 |
Gender == "Male" & (SMI < 53 & BMI >= 25 | SMI < 43 & BMI < 25),
"Yes", "No")
)
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/494917.html
