【问题标题】:Mutating a variable depending on year using r使用 r 根据年份改变变量
【发布时间】:2020-07-30 12:05:18
【问题描述】:

我正在尝试根据年份通过全国平均水平对变量进行标准化,以创建一个新变量,即 Z 分数。这是一个示例数据集:

 DF:
 Var1   Var2
 240     2015
 210     2018
 206     2016
 248     2017
 235     2019
----etc

我正在使用以下代码:

DF$NewZScore<- if (DF$Var2== "2015"){
  (DF$Var1 - 229)/20
} else if (DF$Var2== "2016"){
  ((DF$Var1 - 228)/21
  } else if (DF$Var2== "2017"){
  ((DF$Var1 - 229)/20
    } else if (DF$Var2== "2018"){
  ((DF$Var1 - 230)/19
  } else if (DF$Var2== "2019"){
  ((DF$Var1 - 231)/19
} else {
  + 1000
}

2015 年到 2019 年是我想要的年份,还有其他几年我将过滤掉(因此,+ 1000)。此代码根据 2015 年标准对 Var1 进行变异,而不是按 Var2 中的年份对变量进行变异。任何帮助表示赞赏!

【问题讨论】:

    标签: r if-statement dplyr


    【解决方案1】:

    看看dplyr,在那里你可以使用case_when。另外,我建议您对不想获得 z 分数的条目使用 NA

    library(dplyr)
    df <- read.table(text = " Var1   Var2
     240     2015
     210     2018
     206     2016
     248     2017
     235     2019", header = TRUE)
    
    df_new <- df %>% 
      filter(Var2 >= 2015 & Var2 <= 2019) %>% 
      mutate(NewZScore = case_when(
        Var2 == 2015 ~ (Var1 - 229)/20,
        Var2 == 2016 ~ (Var1 - 228)/21,
        Var2 == 2017 ~ (Var1 - 229)/20,
        Var2 == 2018 ~ (Var1 - 230)/19,
        Var2 == 2019 ~ (Var1 - 231)/19,
        TRUE ~ NA_real_
      ))
    
    df_new
      Var1 Var2  NewZScore
    1  240 2015  0.5500000
    2  210 2018 -1.0526316
    3  206 2016 -1.0476190
    4  248 2017  0.9500000
    5  235 2019  0.2105263
    

    【讨论】:

    • 就是这样!谢谢!
    • 很高兴为您提供帮助!如果此答案回答了您的问题,请考虑接受。
    • 虽然这可以满足我的要求,但它似乎使这个变量在我的数据框中成为一个小问题。你知道我该如何解决这个问题吗?
    • 小标题只是dplyr 添加的一个附加类,它还有data.frame 类,并且(大部分)行为类似。您可以找到更多信息here。否则,您可以使用as.data.frame
    猜你喜欢
    • 1970-01-01
    • 2021-06-02
    • 2019-11-23
    • 1970-01-01
    • 2018-10-01
    • 1970-01-01
    • 2020-04-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多