R 中的 Countif:关系向量

Countif in R: Relational Vectors

我是 R 的新手,我在尝试执行 "countif" 时遇到问题,如 Excel。我所拥有的在下面。有两个向量,vector1 是 vector2 的可能值。 Vector1 数字包括 team_ids 以表示可能在锦标赛中赢得比赛的球队。 Vector2 是模拟的结果。

之所以不能用atable来总结模拟,是因为game63中很多队伍不会出现,但我还是想return一个0.

最后,我想添加一个向量 possible_teams_prob 来计算 possible_teams 中每个项目在 game63 中出现的次数。这样我就可以组合成最终可能的 table,其中列出了球队以及他们赢得比赛的概率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

试试这个:

# 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

有趣的问题。通常,可以使用 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))

哪个returns

[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 也可以工作,并且不需要 "target value" 定义,但可能因此变慢。你的箱子够小没关系。

> 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