【问题标题】:Grouping, Selecting, and Mutate using R使用 R 进行分组、选择和变异
【发布时间】:2020-08-21 16:35:32
【问题描述】:

我有一个包含很多变量的数据框。我想按年份对我正在检查的变量进行分组,然后将它们标准化。这是一个示例 DF:

DF:

Var1   Var2   Year  BioTest   MathExam   WritingScore   Var3  Var 4
 X      X     2016   165        140         10           X     X
 X      X     2017   172        128         11           X     X
 X      X     2018   169        115          8           X     X
 X      X     2016   166        139         10           X     X
 X      X     2017   165        140         12           X     X

etc

我一直在尝试这些代码,但似乎无法正确:

DF<-DF %>%
group_by(Year) %>%
mutate(across(c("BioTest", "MathExam", "WritingScore")), scale)

DF<-DF %>%
group_by(Year) %>%
mutate(c(BioTest, MathExam, WritingScore)), scale)

任何帮助将不胜感激!

【问题讨论】:

    标签: r dplyr data-wrangling


    【解决方案1】:

    我建议使用dplyr 示例使用across() 的下一种方法:

    library(dplyr)
    #Data
    data(iris)
    #Code
    iris %>% group_by(Species) %>% mutate(across(Sepal.Length:Petal.Width,scale))
    

    across() 中,我已经定义了要缩放的变量范围和函数。

    输出:

    # A tibble: 150 x 5
    # Groups:   Species [3]
       Sepal.Length[,1] Sepal.Width[,1] Petal.Length[,1] Petal.Width[,1] Species
                  <dbl>           <dbl>            <dbl>           <dbl> <fct>  
     1           0.267           0.190            -0.357          -0.436 setosa 
     2          -0.301          -1.13             -0.357          -0.436 setosa 
     3          -0.868          -0.601            -0.933          -0.436 setosa 
     4          -1.15           -0.865             0.219          -0.436 setosa 
     5          -0.0170          0.454            -0.357          -0.436 setosa 
     6           1.12            1.25              1.37            1.46  setosa 
     7          -1.15           -0.0739           -0.357           0.512 setosa 
     8          -0.0170         -0.0739            0.219          -0.436 setosa 
     9          -1.72           -1.39             -0.357          -0.436 setosa 
    10          -0.301          -0.865             0.219          -1.39  setosa 
    # ... with 140 more rows
    

    保留原始名称,就像在您的初始数据框中一样。对于您添加的数据,这是代码和结果:

    df %>% group_by(Year) %>% mutate(across(BioTest:WritingScore,scale))
    

    输出:

    # A tibble: 5 x 4
    # Groups:   Year [3]
       Year BioTest[,1] MathExam[,1] WritingScore[,1]
      <int>       <dbl>        <dbl>            <dbl>
    1  2016      -0.707        0.707          NaN    
    2  2017       0.707       -0.707           -0.707
    3  2018     NaN          NaN              NaN    
    4  2016       0.707       -0.707          NaN    
    5  2017      -0.707        0.707            0.707
    

    您可以进一步处理输出,但对于真实数据,您应该有更多的观察结果。

    最后部分使用的一些数据是:

    df <- structure(list(Year = c(2016L, 2017L, 2018L, 2016L, 2017L), BioTest = c(165L, 
    172L, 169L, 166L, 165L), MathExam = c(140L, 128L, 115L, 139L, 
    140L), WritingScore = c(10L, 11L, 8L, 10L, 12L)), class = "data.frame", row.names = c(NA, 
    -5L))
    

    【讨论】:

    • 我刚试过这个,这是我得到的错误:错误:mutate() 输入问题..1。 x across() 输入 .fns 有问题。 i 输入 .fns 必须为 NULL、函数、公式或函数/公式列表。 i 输入..1across(...)。 i 组 1 中出现的错误:TestYear = 2008。我需要的列都不是在一行中,我已经输入了它们,后跟逗号。 IE。 ...跨越(Sepal.Width,Petal.Length,比例))。我输入错误了吗?
    • @JeffB 在across 中,你必须包含你的变量。试试across(c(var1,var2,varn),scale) 里面mutate() 让我知道这是否有效!
    • 类似df %&gt;% group_by(Year) %&gt;% mutate(across(c(BioTest,WritingScore),scale))@JeffB 还要检查答案的最后部分!
    • 这成功了!我的数据中确实有一些 NA,我需要在此代码中写入“na.rm = TRUE”吗?谢谢!
    • @JeffB 很好,因为NA 更好,如果您查看此帖子stackoverflow.com/questions/35775696/… :)
    【解决方案2】:

    data.table

    library(data.table)
    setDT(df)[, lapply(.SD, function(x) scale(x)[,1]), Year]
    

    数据

    df <- structure(list(Year = c(2016L, 2017L, 2018L, 2016L, 2017L), BioTest = c(165L, 
    172L, 169L, 166L, 165L), MathExam = c(140L, 128L, 115L, 139L, 
    140L), WritingScore = c(10L, 11L, 8L, 10L, 12L)), class = "data.frame", 
    row.names = c(NA, 
    -5L))
    

    【讨论】:

      猜你喜欢
      • 2016-06-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-26
      • 2020-03-21
      • 2016-06-03
      • 2021-01-03
      • 2016-06-28
      相关资源
      最近更新 更多