Вы, вероятно, хотите что-то вроде этого: (используя data.table)
n <- 1e3
v <- LETTERS[1:5]
set.seed(42)
df <- data.frame(A = sample(v, n, replace = T),
B = sample(v, n, replace = T),
C = sample.int(1e2, n, replace = T))
require(data.table)
dt <- as.data.table(df)
r <- dt[, .(v = mean(C)), keyby = .(A, B)] # calculate mean for each combination
r <- dcast(r, B ~ A, value.var = 'v') # transform to your structure
rmat <- as.matrix(r[, -1]) # to matrix
rownames(rmat) <- r[[1]] # add row names
rmat[1:5, 1:5]
# A B C D E
# A 53.00000 42.71739 53.11538 49.35000 53.14286
# B 50.62745 58.41379 60.43590 48.75000 56.56410
# C 43.75000 42.93548 55.45000 52.63415 44.27907
# D 50.00000 49.84314 57.48276 50.37143 53.16667
# E 43.95122 55.46667 55.38095 43.85366 53.22222
P.S. Ваш опубликованный код был неверным. петли должны быть:
for (row in rownames(mat)) {
for (col in colnames(mat)) {
x <- subset(df, A == col & B == row)
mat[row, col] = mean(x$C)
}
}
P.S.S. цикл может быть оптимизирован как:
for (row in rownames(mat)) {
for (col in colnames(mat)) {
i <- (df$A == col & df$B == row)
mat[row, col] <- mean(df[i, 'C'])
}
}