使用 R 进行分组、选择和变异

Grouping, Selecting, and Mutate using R

我有一个包含很多变量的数据框。我想按年份对我正在检查的变量进行分组,然后将它们标准化。这是一个例子 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)

如有任何帮助,我们将不胜感激!

我建议使用 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))

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))