将观察数据框架转换为等级

时间:2016-11-17 09:09:34

标签: r dplyr

我有这样的数据集:

df <- data.frame(situation1=rnorm(30),
             situation2=rnorm(30),
             situation3=rnorm(30),
             models=c(rep("A",10), rep("B",10), rep("C", 10)))

我在三种情况下比较三种模型(A,B,C)。我为每个模型进行了10次测量。

我现在想要将其总结为等级,即每个模型在每次参与中获胜的频率。 Win由最高值定义。

最终输出可能是这样的:

model situation1 situtation2 situtation3
A          4          3            3
B          7          1            2
C          1          4            5

3 个答案:

答案 0 :(得分:7)

base R

table(df$models,colnames(df[-4])[max.col(df[-4])])
#    situation1 situation2 situation3
#  A          2          4          4
#  B          4          5          1
#  C          2          4          4

结果可能会与您的OP有所不同,因为您没有设置seed

答案 1 :(得分:4)

这是一个dplyr选项:

df %>% 
  group_by(models) %>% 
  mutate_all(funs(. == pmax(situation1, situation2, situation3))) %>% 
  summarise_all(sum)

或者可能更有效率:

df %>% 
  mutate_at(vars(-models), funs(. == pmax(situation1, situation2, situation3))) %>% 
  group_by(models) %>% 
  summarise_all(sum)
## A tibble: 3 × 4
#  models situation1 situation2 situation3
#   <chr>      <int>      <int>      <int>
#1      A          3          3          3
#2      B          3          5          1
#3      C          6          1          2

如果您正在寻找最低要求,请使用pmin代替pmax。如果可能有NAs,请使用na.rm / pmax中的pmin - 参数。

最后注意事项:结果与OP不匹配,因为样本数据是在没有设置种子的情况下生成的。

答案 2 :(得分:4)

以下是使用data.table

的选项
library(data.table)
setDT(df)[, lapply(Map(`==`, .SD, list(do.call(pmax, .SD))), sum), models]