询问在R中编写代码的更好方法

时间:2018-04-29 18:34:08

标签: r mapping

我是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 个答案:

答案 0 :(得分:4)

您可以使用cut

df$rank <- cut(x = df$score,c(0,1.2,2.1,2.9,3.7,4.5,5.4,Inf),FALSE)

答案 1 :(得分:1)

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

reprex package(v0.2.0)创建于2018-04-29。

答案 2 :(得分:0)

由于你没有添加一个可重复的例子,我创建了一个小例子(但请记住,你应该总是添加一个例子)。

从基地使用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应该是你的最大等级值,所以&#34; no&#34;参数将是最后一个范围。

如果这是一个重新出现的问题,你应该创建一个函数。

希望它有所帮助。