我有这样的数据集:
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
答案 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]