R 向数据框中的值添加值范围标记
我正在尝试向数据框中的值添加某些标记,类似于向标记添加等级列。唯一的区别是每门学科的等级表是不同的 雷普雷克斯:R 向数据框中的值添加值范围标记,r,R,我正在尝试向数据框中的值添加某些标记,类似于向标记添加等级列。唯一的区别是每门学科的等级表是不同的 雷普雷克斯: # Specifying grade range for each subject range <- data.frame(Subject <- rep(c('Math','Physics'),each = 3), Start <- c(91,81,71,81,61,41), End &
# Specifying grade range for each subject
range <- data.frame(Subject <- rep(c('Math','Physics'),each = 3),
Start <- c(91,81,71,81,61,41),
End <- c(100,90,80,100,80,60),
Grade <- rep(LETTERS[1:3],2),stringsAsFactors = F)
colnames(range) <- c('Subject','Start','End','Grade')
# Marks data of students
set.seed(50)
df <- data.frame(Subject <- rep(c('Math','Physics'),each = 4),
Student <- rep(c('Eeny','Meeny','Miny','Mo'),2),
Marks <- c(sample(40:100,7,T),NA))
colnames(df) <- c('Subject','Student','Marks')
#指定每个科目的成绩范围
范围这就是你要找的吗
df %>% mutate(Grade = case_when(Subject == "Math" & Marks %in% 91:100 ~ "A",
Subject == "Math" & Marks %in% 81:90 ~ "B",
Subject == "Math" & Marks %in% 71:80 ~ "C",
Subject == "Physics" & Marks %in% 81:100 ~ "A",
Subject == "Physics" & Marks %in% 61:80 ~ "B",
Subject == "Physics" & Marks %in% 41:60 ~ "C",
TRUE ~ NA_character_))
Subject Student Marks Grade
1 Math Eeny 94 A
2 Math Meeny 42 <NA>
3 Math Miny 47 <NA>
4 Math Mo 99 A
5 Physics Eeny 55 C
6 Physics Meeny 57 C
7 Physics Miny 66 B
8 Physics Mo NA <NA>
df%>%mutate(分数=case_)当(科目==“数学”和分数%91:100~“A”,
主题==“数学”&在%81:90~“B”中标记%,
主题==“数学”&在%71:80~“C”中标记%,
主题==“物理”&在%81:100~“A”中标记%,
主题==“物理”&在%61:80~“B”中标记%,
主题==“物理”&在%41:60~“C”中标记%,
真~NA_字符))
科目学生成绩
1数学Eeny 94 A
2数学会议42
3数学知识47
4数学Mo 99 A
5年55度
6米尼57 C
7米尼66 B
8物理莫娜
这就是你要找的吗
df %>% mutate(Grade = case_when(Subject == "Math" & Marks %in% 91:100 ~ "A",
Subject == "Math" & Marks %in% 81:90 ~ "B",
Subject == "Math" & Marks %in% 71:80 ~ "C",
Subject == "Physics" & Marks %in% 81:100 ~ "A",
Subject == "Physics" & Marks %in% 61:80 ~ "B",
Subject == "Physics" & Marks %in% 41:60 ~ "C",
TRUE ~ NA_character_))
Subject Student Marks Grade
1 Math Eeny 94 A
2 Math Meeny 42 <NA>
3 Math Miny 47 <NA>
4 Math Mo 99 A
5 Physics Eeny 55 C
6 Physics Meeny 57 C
7 Physics Miny 66 B
8 Physics Mo NA <NA>
df%>%mutate(分数=case_)当(科目==“数学”和分数%91:100~“A”,
主题==“数学”&在%81:90~“B”中标记%,
主题==“数学”&在%71:80~“C”中标记%,
主题==“物理”&在%81:100~“A”中标记%,
主题==“物理”&在%61:80~“B”中标记%,
主题==“物理”&在%41:60~“C”中标记%,
真~NA_字符))
科目学生成绩
1数学Eeny 94 A
2数学会议42
3数学知识47
4数学Mo 99 A
5年55度
6米尼57 C
7米尼66 B
8物理莫娜
在dplyr管道之前,编写一个小函数为您实现这一点可能同样简单:
grade_it <- function(marks, subject)
{
helper <- function(x, y)
{
z <- range$Grade[range$Start <= x & range$End >= x & range$Subject == y];
if(length(z) == 1) return(z) else return("FAIL")
}
mapply(helper, marks, subject)
}
在使用dplyr管道之前,编写一个小函数为您实现这一点可能同样容易:
grade_it <- function(marks, subject)
{
helper <- function(x, y)
{
z <- range$Grade[range$Start <= x & range$End >= x & range$Subject == y];
if(length(z) == 1) return(z) else return("FAIL")
}
mapply(helper, marks, subject)
}
非常感谢。但我相信在我的案例中,这种方法并不友好,因为首先,我在.csv中已经有了范围
数据框,其次,在我的实际范围
数据框中有两个以上(大约35个)的主题。这个merge(df,range)%%>%过滤器(开始时非常感谢。但我相信在我的情况下,这种方法并不友好,因为首先,我在.csv中已经有了range
数据框,其次,在我的实际range
数据框中有两个(大约35个)主题哦,我明白了。这个merge(df,range)%%>%filter(开始整洁!这正是我想要的。我原以为R中会有一个内置功能(可能是某种数据.table
或dplyr
解决方案),所以从来没有想过要编写一个函数。非常感谢!整洁!这正是我想要的。我原以为R中会有一个内置功能(可能是某种data.table
或dplyr
解决方案)所以不要考虑编写函数。非常感谢!