2016-11-17 29 views
2

我有一個數據集合是這樣的:翻譯觀測數據幀劃分成行列

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

其中I在三種情況下比較三種模式(A,B,C)。我有10個測量每個模型。

我現在想將這個概括爲行列,即每個模型在每個情景中勝出的頻率。 Win由最高值定義。

最終輸出可能是這樣的:

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

在使用功能,如創建數據幀請使用'set.seed'選項'rnorm' – Sotos

+0

對不起,增加了對勝利的定義。 Win是最高的價值 – spore234

回答

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

+0

不錯的解決方案,是否還有最低的等價物? – spore234

+0

當然。 'max.col(-df [-4])'將找到'df'的最小值的索引。 – nicola

+0

有沒有一種簡單的方法來明智地做到這一點。這意味着,例如,每個模型有多少勝。 situtation1。最終輸出應該與上面相同,但現在列總和將是10(不是行總和)。 – spore234

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,請使用-參數pmax/pmin

最後說明:結果與OP不匹配,因爲樣本數據是在沒有設置種子的情況下生成的。

4

下面是使用data.table

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