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