你好!
在以下示例中,引用似乎存在问题。该代码重新组装了2v2游戏的国际象棋排名系统的计算。 "数据"中的每一行是游戏的结果
users表包含正在玩游戏的所有人。人们可以分为6类:" INT"," LKS"," SOD"," SJV"," LOY&#34 ;和" STA"。 " sex" -column表示男性/女性为0或1 - 此列永远不应更新。
数据文件是本文末尾的耗材。 这是我现在的代码:
data <- read.csv("data.txt", header=F, quote="")
colnames(data) <- c("user", "p1","p2", "skill","win","looser","time")
data <- data[-which(data$user==data$p1),]
data <- data[-which(data$user==data$p2),]
users <- data.matrix(read.csv("users.txt", header = FALSE, row.names = 1))
colnames(users) <- c("sex", "INT", "LKS", "LOY", "SJV", "SOD", "STA")
for (i in 1:nrow(data)) {
game <- data[i,]
winner.old <- users[game$win, game$skill]
looser.old <- users[game$looser, game$skill]
winner.new <- winner.old + 32/2 * (1 - 0 + (1/2) * (looser.old-winner.old) / 200)
looser.new <- looser.old + 32/2 * (0 - 1 + (1/2) * (winner.old-looser.old) / 200)
users[game$win, game$skill] <- winner.new
users[game$looser, game$skill] <- looser.new
}
问题是
users[game$win, game$skill]
这似乎引用了错误的技能专栏。我试图在下图中显示问题。对不起,它有点乱 - 但我已经尝试过对它进行颜色编码了!该输出从i <-1生成。运行整个for循环,您将看到STA列出现&#34;未触及&#34; - 它总是使用它应该使用的那个列的左边的列。
数据 http://textuploader.com/o68x
users.txt http://textuploader.com/o68g
答案 0 :(得分:0)
因素是内部整数,如果您将它们用于子集,则使用内部表示:
DF <- data.frame(x=1:10)
DF$g <- c("b", "a")
# x g
# 1 1 b
# 2 2 a
# 3 3 b
# 4 4 a
# 5 5 b
# 6 6 a
# 7 7 b
# 8 8 a
# 9 9 b
# 10 10 a
col <- factor("g", levels=c("g", "x"))
DF[, col]
#[1] 1 2 3 4 5 6 7 8 9 10
as.integer(col)
#[1] 1
您需要将因子转换为用于子集化的字符:
DF[, as.character(col)]
#[1] "b" "a" "b" "a" "b" "a" "b" "a" "b" "a"