Класс индикатора ниже или класс выше с порядковыми данными в R

У меня есть такие люди, чьи показатели могут снижаться или повышаться. Предположим, есть три категории, поэтому порядковые данные с классами: 1 = низкий, 2 = средний, 3 = высокий. Я измеряю их в точке 1 (df$ начало) и в точке 2 (df$ конец). Я хочу знать, стали ли они лучше (значение индикатора = 1), хуже (значение индикатора = -1) или остались ровными (значение индикатора = 0) (df_result$diff).

Я преобразовал тип данных в упорядоченный и думаю, что должен использовать логическое утверждение, но я не знаю, как это сделать в R. У кого-нибудь есть элегантный способ сделать это?

df <- data.frame(start = ordered(c(1, 3, 2, 3)),
             end = ordered(c(2, 3, 3, 1)))

df_result <- data.frame(start = ordered(c(1, 3, 2, 3)),
                    end = ordered(c(2, 3, 3, 1)),
                    diff = c(1, 0, 1, -1))

3 ответа

Мы можем сделать это арифметически также, если столбцы 'start' и 'end' numeric

df$diff <- with(df, c(0, -1, 1)[((start > end) + 2 *(start < end))+1])
df$diff
#[1]  1  0  1 -1

данные

df <- data.frame(start = c(1, 3, 2, 3), end = c(2, 3, 3, 1))

Другой вариант case_when от dplyr пакет:

df <- data.frame(start = ordered(c(1, 3, 2, 3)),
                 end = ordered(c(2, 3, 3, 1)))

library(dplyr)

df %>% mutate(diff = case_when(start < end ~ 1,
                               start > end ~ -1,
                               TRUE ~ 0))

#   start end diff
# 1     1   2    1
# 2     3   3    0
# 3     2   3    1
# 4     3   1   -1

Много способов сделать это, вот одно решение

df <- data.frame(start = c(1, 3, 2, 3),
             end = c(2, 3, 3, 1))

df$diff <- ifelse(df$start-df$end > 0, "worse", ifelse(df$start-df$end == 0, "even", "better"))
df
  start end   diff
1     1   2 better
2     3   3   even
3     2   3 better
4     3   1  worse
Другие вопросы по тегам