【问题标题】:How do I write my own function to create a z-score in R如何编写自己的函数来在 R 中创建 z 分数
【发布时间】:2021-12-07 19:33:42
【问题描述】:

我正在练习编写自己的函数。我尝试创建用于创建 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,但没有创建新变量。有什么建议吗?

【问题讨论】:

    标签: r function


    【解决方案1】:

    三个cmets:

    1. 您的函数 zscore 有 4 个参数(xmean_xsd_xzscore_x),但您只使用其中一个参数(x)。我的第一个建议是只使用一个参数,如下所示:

      zscore <- function(x) {...}
      
    2. 下一个问题是在函数体中放入什么。在这里,我们只需要简单的 z-score 计算:

      zscore <- function(x) {
          (x - mean(x, na.rm=T) ) / sd(x, na.rm=T)
      }  
      
    3. 您应该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
    

    【讨论】:

    • 感谢您的帮助!成功了!
    【解决方案2】:

    如果您想在dplyr 中设置名称,如果它是version &gt;= 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
    

    【讨论】:

      猜你喜欢
      • 2021-08-29
      • 1970-01-01
      • 2011-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多