2015-01-15 34 views
0

我是新的使用R和我有一個問題試圖執行「countif」在Excel中。我擁有的是以下。有兩個向量,vector1是vector2的可能值。 Vector1數字包括team_ids來表示可能在錦標賽中贏得比賽的可能的球隊。 Vector2是模擬的結果。Countif在R:Relational Vectors

爲什麼我不能用一個表來概括模擬的是,很多球隊會不會在game63表示,但我仍想返回一個0

最後,我想原因喜歡添加一個向量possible_teams_prob來計算possible_teams中每個項目在game63中的次數。通過這種方式,我可以組合成一個最終可能的表格,其中列出了球隊列表以及贏得比賽的可能性63。

> possible_teams <- seq(1,64) 
> possible_teams 
[1] 1 2 3 4 5 6 7 8 9 10 11 12 
[13] 13 14 15 16 17 18 19 20 21 22 23 24 
[25] 25 26 27 28 29 30 31 32 33 34 35 36 
[37] 37 38 39 40 41 42 43 44 45 46 47 48 
[49] 49 50 51 52 53 54 55 56 57 58 59 60 
[61] 61 62 63 64 

> game63[1:20] 
[1] 4 8 4 4 3 20 2 3 3 1 3 20 
[13] 3 8 2 4 3 1 14 3 

回答

0

有趣的問題。一般來說,可以使用R評估TRUE爲1和FALSE爲0的事實來完成許多COUNTIF類型的工作。不過,在這種情況下,你需要沿着矢量。編寫一個循環肯定會起作用,但這是R,所以我們需要使用一些矢量化版本,這導致了一個到apply系列。在這種情況下,下面好像是你想要什麼:

f2 <- function(V1, V2) sum(V1 == V2) 
vapply(possible_teams, f2, V2 = game_63, FUN.VALUE = double(1)) 

返回

[1] 2 2 7 4 0 0 0 2 0 0 0 0 0 1 0 0 0 0 0 2 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 

該作品以建立其創建載體之間的「COUNTIF」的功能。它不會自行工作,因爲它預計向量和兩個不會很好地回收,但vapply將沿着第一個向量的長度迭代該函數,這正是您想要的。

sapply也可以正常工作,並且不需要「目標值」定義,但可能會因此而變慢。你的情況足夠小,它並不重要。

> microbenchmark(sapply(possible_teams, f2, V2 = game_63), vapply(possible_teams, f2, V2 = game_63, FUN.VALUE = double(1)), times = 1000L, control=list(order='block')) 
Unit: microseconds 
                  expr min  lq  mean median  uq  max neval 
         sapply(possible_teams, f2, V2 = game_63) 89.351 92.926 103.31433 95.309 100.371 945.629 1000 
vapply(possible_teams, f2, V2 = game_63, FUN.VALUE = double(1)) 61.057 64.631 73.80298 67.610 71.779 1223.510 1000 
0

試試這個:

# recreate your data 
allteams <- seq(64) 
# summarize the game63 data to get counts by team 
temp = tapply(game63,game63,length) 
# initialize return vector 
answer = integer(length(allteams)); names(answer) <- 1:64 
# replace true values 
answer <- temp[match(allteams,names(temp))] 
# replace missing values 
answer[is.na(answer)] <- 0