2015-01-15 33 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