В поисках лучшего способа написания кода на R - PullRequest
0 голосов
/ 29 апреля 2018

Я новичок в 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 голосов
/ 29 апреля 2018
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-04-29 пакетом представ (v0.2.0).

0 голосов
/ 29 апреля 2018

Вы можете использовать cut:

df$rank <- cut(x = df$score,c(0,1.2,2.1,2.9,3.7,4.5,5.4,Inf),FALSE)
0 голосов
/ 29 апреля 2018

Поскольку вы не добавили воспроизводимый пример, я создал маленький (но учтите, что вы всегда должны добавлять пример).

Используя 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 должно быть вашим максимальным значением ранга, поэтому аргумент «нет» будет последним диапазоном.

Если это повторяющаяся проблема, вам следует создать функцию.

Надеюсь, это поможет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...