Jak*_*ake 3 for-loop r dataframe
我是R的新手,我写了一个代码,我相信可以通过for循环来缩短代码。问题是我不知道如何编写循环。
我有一个带有“ TestGrade”列的数据框,其值类似于“ Grade 1”或“ Kindergarten”。我试图将该列更改为仅一个数字值。例如,将“幼儿园”更改为0,将“等级1”更改为1。我将在示例数据框的下面提供代码,以及如何无循环解决问题。
任何指导将不胜感激!
##Sample Data
FirstInitial <- c("A", "D", "M", "C", "J", "S", "K", "L", "M", "K", "G", "B", "F")
LastInitial <- c("S", "M", "T", "M", "A", "B", "H", "M", "S", "W", "L", "Z", "P")
TestGrade <- c('Kindergarten', 'Grade 1','Grade 2', 'Grade 3','Grade 4', 'Grade 5', 'Grade 6','Grade 7','Grade 8', 'Grade 9', 'Grade 10', 'Grade 11','Grade 12')
df <- data.frame(FirstInitial, LastInitial, TestGrade)
##The codes current function
if(any(df$TestGrade == 'Kindergarten')){
df$TestGrade <- gsub('Kindergarten', '0', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 1')){
df$TestGrade <- gsub('Grade 1', '1', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 2')){
df$TestGrade <- gsub('Grade 2', '2', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 3')){
df$TestGrade <- gsub('Grade 3', '3', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 4')){
df$TestGrade <- gsub('Grade 4', '4', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 5')){
df$TestGrade <- gsub('Grade 5', '5', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 6')){
df$TestGrade <- gsub('Grade 6', '6', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 7')){
df$TestGrade <- gsub('Grade 7', '7', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 8')){
df$TestGrade <- gsub('Grade 8', '8', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 9')){
df$TestGrade <- gsub('Grade 9', '9', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 10')){
df$TestGrade <- gsub('Grade 10', '10', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 11')){
df$TestGrade <- gsub('Grade 11', '11', df$TestGrade)
}
if(any(df$TestGrade == 'Grade 12')){
df$TestGrade <- gsub('Grade 12', '12', df$TestGrade)
}
Run Code Online (Sandbox Code Playgroud)
我们可以使用ifelse
,为“幼儿园”分配0,从其他人中删除“成绩”
as.numeric(ifelse(df$TestGrade == "Kindergarten", 0,
sub("Grade ", "", df$TestGrade)))
#[1] 0 1 2 3 4 5 6 7 8 9 10 11 12
Run Code Online (Sandbox Code Playgroud)
我们可以用 case_when
library(dplyr)
library(readr)
df %>%
mutate(TestGrade = case_when(as.character(TestGrade) == "Kindergarten"~ 0,
TRUE ~ parse_number(TestGrade)))
# FirstInitial LastInitial TestGrade
#1 A S 0
#2 D M 1
#3 M T 2
#4 C M 3
#5 J A 4
#6 S B 5
#7 K H 6
#8 L M 7
#9 M S 8
#10 K W 9
#11 G L 10
#12 B Z 11
#13 F P 12
Run Code Online (Sandbox Code Playgroud)