问题描述
我有一个包含很多变量的数据框。我想按年份对要检查的变量进行分组,然后对其进行标准化。这是DF示例:
chrome://inspect/#devices
我一直在尝试这些代码,但似乎无法正确处理
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)
任何帮助将不胜感激!
解决方法
我将建议使用dplyr
的{{1}}示例的下一种方法:
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
,
使用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))