根据涉及另一列的条件在r中创建一列

时间:2020-07-03 10:44:23

标签: r

我想在数据集中创建一个新列,其中包含根据学生在考试中的成绩得出的熟练程度。因此,如果学生的成绩在0到10之间,则分配给他们的等级应为A1,如果成绩在11到16之间,则分配的等级应为A2,依此类推。如何在R中编写代码?我试过下面的代码。新列已创建,但仅包含级别A1。因此,该条件无效。有人可以帮我吗?

    data$CatEnglishTest=as.factor(ifelse(data$EnglishTestGrade %in% 
data$EnglishTestGrade<=10,'A1',
                               ifelse(data$EnglishTestGrade %in% data$EnglishTestGrade > 10 
&& data$EnglishTestGrade < 15,'A2',
                                      as.character(data$EnglishTestGrade))))

3 个答案:

答案 0 :(得分:0)

library(dplyr)

data <- data.frame(EnglishTestGrade = c(0, 5, 10, 14, 20)) 

data <- mutate(data, 
               CatEnglishTest = case_when(
                 EnglishTestGrade <= 10 ~ "A1",
                 EnglishTestGrade < 15  ~ "A2",
                 TRUE ~ "Undefined category"
               ))

答案 1 :(得分:0)

说你有学生分数

scores <- data.frame(student=paste("ID",1:10),score = seq(10,100,10))

   student score
1     ID 1    10
2     ID 2    20
3     ID 3    30
4     ID 4    40
5     ID 5    50
6     ID 6    60
7     ID 7    70
8     ID 8    80
9     ID 9    90
10   ID 10   100

以及评分等级

scale <- data.frame(score = seq(0,100,25), grade = LETTERS[5:1])

  score grade
1     0     E
2    25     D
3    50     C
4    75     B
5   100     A

然后您可以使用此代码为每个学生分配一个成绩

scores$grades <- scale$grade[sapply(scores$score, function(x) tail(which(x >= scale$score),1))]

   student score grades
1     ID 1    10      E
2     ID 2    20      E
3     ID 3    30      D
4     ID 4    40      D
5     ID 5    50      C
6     ID 6    60      C
7     ID 7    70      C
8     ID 8    80      B
9     ID 9    90      B
10   ID 10   100      A

答案 2 :(得分:0)

我创建了一个小示例DF。

EnglishTestGrade <- sample(1:20,20)
Student <- LETTERS[1:20]
data <- data.frame(EnglishTestGrade, Student)
str(data)
#> 'data.frame':    20 obs. of  2 variables:
#>  $ EnglishTestGrade: int  1 15 19 12 3 14 8 16 2 18 ...
#>  $ Student         : chr  "A" "B" "C" "D" ...


data$CatEnglishTest <- ifelse(data$EnglishTestGrade %in%
  data[data$EnglishTestGrade <= 10,]$EnglishTestGrade, 'A1',
    ifelse(data$EnglishTestGrade %in% 
             (data[data$EnglishTestGrade > 10,]$EnglishTestGrade &
             data[data$EnglishTestGrade < 15,]$EnglishTestGrade), 'A2', 
           as.character(data$EnglishTestGrade)
  )
)
#> Warning in data[data$EnglishTestGrade > 10, ]$EnglishTestGrade & data[data$EnglishTestGrade < : Länge des längeren Objektes
#>       ist kein Vielfaches der Länge des kürzeren Objektes
data
#>    EnglishTestGrade Student CatEnglishTest
#> 1                 1       A             A1
#> 2                15       B             15
#> 3                19       C             19
#> 4                12       D             12
#> 5                 3       E             A1
#> 6                14       F             14
#> 7                 8       G             A1
#> 8                16       H             16
#> 9                 2       I             A1
#> 10               18       J             18
#> 11                9       K             A1
#> 12               10       L             A1
#> 13                7       M             A1
#> 14                4       N             A1
#> 15               11       O             11
#> 16               17       P             17
#> 17               20       Q             20
#> 18               13       R             13
#> 19                6       S             A1
#> 20                5       T             A1