0

我有这个人的表现可以降低或提高。假设有三个类别,那么有序数据与类别:1 = 低,2 = 中,3 = 高。我在第 1 点 (df$start) 和第 2 点 (df$end) 测量它们。我想知道它们是变得更好(指标值 = 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))
4

3 回答 3

0

方法很多,这里有一个解决方案

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
于 2018-03-26T09:29:56.913 回答
0

另一个选项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
于 2018-03-26T09:34:25.663 回答
0

如果“开始”和“结束”列是,我们也可以在算术上做到这一点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))
于 2018-03-26T09:36:24.127 回答