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
解决方案)所以不要考虑编写函数。非常感谢!