我正在練習撰寫自己的函式。我嘗試創建用于創建 z 分數的函式
age <- c(25, 30, 28, 40, 50)
bmi <- c(22, 24, 30, 26, 35)
test.data <- cbind.data.frame(age, bmi)
zscore <- function(x, mean_x, sd_x, zscore_x) {
test.data <- test.data %>%
mutate(mean_x = mean(x, na.rm = T),
sd_x = sd(x, na.rm = T),
zscore_x = (x - mean_x) / sd_x)
}
zscore(x = bmi,
mean_x = mean_bmi,
sd_x = sd_bmi,
zscore_x = zscore_bmi)
我希望創建一個名為 zscore_bmi 的新變數,并將其添加到 test.data 中,但未創建新變數。有什么建議?
uj5u.com熱心網友回復:
三點意見:
您的函式
zscore有 4 個引數 (x、mean_x、sd_x和zscore_x),但您只使用其中一個 (x)。我的第一個建議是只有一個引數,如下所示:zscore <- function(x) {...}下一個問題是在函式體中放什么。在這里,我們只需要簡單的 z-score 計算:
zscore <- function(x) { (x - mean(x, na.rm=T) ) / sd(x, na.rm=T) }你應該不把
test.data在函式體,因為它不是一個函式引數。只計算并回傳引數的 z 分數會好得多。然后,您可以將該 z 分數分配為一個新列,test.data如下所示:test.data$zscore_myvar <- zscore(myvar)
把這一切放在一起,這就是你想要的:
zscore <- function(x) {
(x - mean(x, na.rm=T) ) / sd(x, na.rm=T)
}
test.data$zscore_bmi <- zscore(bmi)
請注意,R 函式scale執行相同的操作,可用于檢查您的作業:
scale(bmi)
## 1.0431010 -0.6567673 0.5022338 -0.2704336 1.4680681
uj5u.com熱心網友回復:
如果你想在一組的名稱dplyr,如果是version >= 1.0,使用"{{...}}" :=。
zscore <- function(x, mean_x, sd_x, zscore_x) {
test.data %>%
dplyr::mutate("{{mean_x}}" := mean(x, na.rm = T),
"{{sd_x}}" := sd(x, na.rm = T),
"{{zscore_x}}" := (x - {{mean_x}}) / {{sd_x}})
}
zscore(x = bmi,
mean_x = mean_bmi,
sd_x = sd_bmi,
zscore_x = zscore_bmi)
age bmi mean_bmi sd_bmi zscore_bmi
1 25 22 27.4 5.176872 -1.0431010
2 30 24 27.4 5.176872 -0.6567673
3 28 30 27.4 5.176872 0.5022338
4 40 26 27.4 5.176872 -0.2704336
5 50 35 27.4 5.176872 1.4680681
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/329380.html
