Класс индикатора ниже или класс выше с порядковыми данными в 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