代码之家  ›  专栏  ›  技术社区  ›  Lonewolf

探索在R中编写代码的更好方法

  •  0
  • Lonewolf  · 技术社区  · 6 年前

    我是R新手,希望能得到帮助,找到更好的方法来编写我编写的以下代码。任何帮助都将不胜感激。

    df$rank[between(df$score,0,1.2)] <- 1
    df$rank[between(df$score,1.2,2.1)] <- 2
    df$rank[between(df$score,2.1,2.9)] <- 3
    df$rank[between(df$score,2.9,3.7)] <- 4
    df$rank[between(df$score,3.7,4.5)] <- 5
    df$rank[between(df$score,4.5,5.4)] <- 6
    
    3 回复  |  直到 6 年前
        1
  •  4
  •   moodymudskipper    6 年前

    您可以使用 cut :

    df$rank <- cut(x = df$score,c(0,1.2,2.1,2.9,3.7,4.5,5.4,Inf),FALSE)
    
        2
  •  1
  •   Tung    6 年前
    library(dplyr)
    
    set.seed(1234)
    df <- data.frame(rank  = rep(0, 15),
                     score = runif(15, 0, 6))
    df
    
    #>    rank      score
    #> 1     0 0.68222047
    #> 2     0 3.73379643
    #> 3     0 3.65564840
    #> 4     0 3.74027665
    #> 5     0 5.16549230
    #> 6     0 3.84186363
    #> 7     0 0.05697454
    #> 8     0 1.39530304
    #> 9     0 3.99650255
    #> 10    0 3.08550685
    #> 11    0 4.16154775
    #> 12    0 3.26984901
    #> 13    0 1.69640150
    #> 14    0 5.54060091
    #> 15    0 1.75389504
    
    df %>% 
      mutate(rank = case_when(between(score,   0, 1.2) ~ 1,
                              between(score, 1.2, 2.1) ~ 2,
                              between(score, 2.1, 2.9) ~ 3,
                              between(score, 2.9, 3.7) ~ 4,
                              between(score, 3.7, 4.5) ~ 5,
                              between(score, 4.5, 5.4) ~ 6))
    #>    rank      score
    #> 1     1 0.68222047
    #> 2     5 3.73379643
    #> 3     4 3.65564840
    #> 4     5 3.74027665
    #> 5     6 5.16549230
    #> 6     5 3.84186363
    #> 7     1 0.05697454
    #> 8     2 1.39530304
    #> 9     5 3.99650255
    #> 10    4 3.08550685
    #> 11    5 4.16154775
    #> 12    4 3.26984901
    #> 13    2 1.69640150
    #> 14   NA 5.54060091
    #> 15    2 1.75389504
    

    创建日期:2018年4月29日 reprex package (v0.2.0)。

        3
  •  0
  •   Giovana Stein    6 年前

    由于您没有添加可复制的示例,所以我创建了一个小示例(但请记住,您应该始终添加一个示例)。

    使用来自base的ifelse,您可以这样做:

    df = data.table(rank = c(1.2, 3.3, 2.5, 3.7, 5.8, 6, 3, 1.1, 0.5))
    df$rank2 = ifelse(df$rank>0 & df$rank<=1.2, 1, 
                 ifelse(df$rank>1.2 & df$rank<=2.1, 2, 
                        ifelse(df$rank>2.1 & df$rank<=2.9, 3, 
                               ifelse(df$rank>2.9 & df$rank<=3.7, 4, 
                                      ifelse(df$rank>3.7 & df$rank<=4.5, 5, 6)))))
    

    最后一个ifelse应该是您的最大秩值,因此“no”参数将是最后一个范围。

    如果这是一个再次出现的问题,您应该创建一个函数。

    希望有帮助。