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
我是 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