【问题标题】:create a column in r based on a condition involving another column根据涉及另一列的条件在 r 中创建一列
【发布时间】:2020-07-03 19:48:38
【问题描述】:

我想在我的数据集中创建一个新列,其中包含基于学生在测试中的成绩的熟练程度。因此,如果学生的成绩在 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))))

【问题讨论】:

  • 这可能与 data$EnglishTestGrade&lt;=10 有关。如果你能做到这一点以及像data[data$EnglishTestGrade &lt;= 10,]$Grade 这样的其他条件,它应该可以工作。
  • 在这段代码的哪里添加“A1”、“A2”等级别?
  • 你能发一个minimal reproducible example。这肯定有助于回答。
  • 我做了一个小例子并展示了如何使用代码,请参阅下面的答案。

标签: r


【解决方案1】:
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"
               ))

【讨论】:

    【解决方案2】:

    假设你有学生的分数

    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
    

    【讨论】:

      【解决方案3】:

      我创建了一个小例子 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
      

      【讨论】:

        猜你喜欢
        • 2021-03-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多