как взять таблицы из (x, y, V) строк и получить матрицу / таблицу, где значение в позиции x, y равно V - PullRequest
2 голосов
/ 30 марта 2011

У меня есть фрейм данных, который выглядит следующим образом:

> ta
   ranks omp  ALLA1
1    512   4  772.9
2   1024   2  769.9
3   2048   1  914.2
4    256   8  932.3
5    128  16 1352.0
6    256  16  948.4
7    512   8  761.5
8   1024   4  667.9
9   2048   2  744.9
10  4096   1  956.7

, и я хочу получить некую матрицу, которая выглядит следующим образом:

    256   512   1024    2048   4096
 1                      914.2  956.7
 2               769.9  744.9
 4        772.9  667.9
 8  932.3 761.5 
16

Я не слишкомсмутил то, что появляется в пропущенных записях.

Ответы [ 4 ]

3 голосов
/ 30 марта 2011

Попробуйте это:

> xtabs(ALLA1 ~ omp + ranks, ta)
    ranks
omp     128    256    512   1024   2048   4096
  1     0.0    0.0    0.0    0.0  914.2  956.7
  2     0.0    0.0    0.0  769.9  744.9    0.0
  4     0.0    0.0  772.9  667.9    0.0    0.0
  8     0.0  932.3  761.5    0.0    0.0    0.0
  16 1352.0  948.4    0.0    0.0    0.0    0.0
1 голос
/ 30 марта 2011

Запуск этого:

with(ta, reshape(ta[order(omp, ranks),], v.names="ALLA1", idvar="omp",
  timevar="ranks", direction="wide"))

Вы получаете что-то очень похожее:

  omp ALLA1.2048 ALLA1.4096 ALLA1.1024 ALLA1.512 ALLA1.256 ALLA1.128
3   1      914.2      956.7         NA        NA        NA        NA
2   2      744.9         NA      769.9        NA        NA        NA
1   4         NA         NA      667.9     772.9        NA        NA
4   8         NA         NA         NA     761.5     932.3        NA
5  16         NA         NA         NA        NA     948.4      1352
0 голосов
/ 28 апреля 2011

Ну, кто-то должен показать, как это сделать с индексацией строк / столбцов ...

ta <- structure(list(ranks = c(512L, 1024L, 2048L, 256L, 128L, 256L, 
512L, 1024L, 2048L, 4096L), omp = c(4L, 2L, 1L, 8L, 16L, 16L, 
8L, 4L, 2L, 1L), ALLA1 = c(772.9, 769.9, 914.2, 932.3, 1352, 
948.4, 761.5, 667.9, 744.9, 956.7)), .Names = c("ranks", "omp", 
"ALLA1"), class = "data.frame", row.names = c(NA, -10L))

out <- with(ta, {
  ranks <- factor(ranks)
  omp <- factor(omp)
  out <- matrix(nrow=nlevels(omp), ncol=nlevels(ranks), 
                dimnames=list(levels(omp), levels(ranks)))
  out[cbind(omp, ranks)] <- ALLA1
  out
})

С результатом

> print(out, na="")
    128   256   512  1024  2048  4096
1                         914.2 956.7
2                   769.9 744.9      
4             772.9 667.9            
8       932.3 761.5                  
16 1352 948.4  
0 голосов
/ 30 марта 2011

Для написания ответа воссоздание фрейма данных ta может быть полезно:

lines = "   ranks omp  ALLA1
1    512   4  772.9
2   1024   2  769.9
3   2048   1  914.2
4    256   8  932.3
5    128  16 1352.0
6    256  16  948.4
7    512   8  761.5
8   1024   4  667.9
9   2048   2  744.9
10  4096   1  956.7"
cn = as.character(read.fwf(textConnection(lines), width=c(3, 5, 4, 7),
  stringsAsFactors=FALSE, strip.white=TRUE)[1,])
ta = read.fwf(textConnection(lines), width=c(3, 5, 4, 7), skip=1,
  col.names=cn)[,-1]
...