изменить фрейм данных в R - PullRequest
0 голосов
/ 08 апреля 2011

у меня есть фрейм данных, сгенерированный внутри цикла for, и эта структура имеет

    V1 V2 V3
1   a  a  1
2   a  b  3
3   a  c  2
4   a  d  1
5   a  e  3
6   b  a  3
7   b  b  1
8   b  c  8
9   b  d  1
10  b  e  1
11  c  a  2
12  c  b  8

данные длиннее этого, но это идея, которую я хочу (преобразовать ее в широкую таблицу [V1 byV2])

V3 - это значение, основанное на (V1, V2)

я хочу переставить данные таким образом (первый столбец уникален для V1, а первый ряд уникаленV2 и данные между ними из V3)

  a b c d e
a 1 3 2 1 3
b 3 1 8 1 1
c 2 8 2 8 2
d 1 1 5 7 2
e 3 5 9 5 3

Thnx заранее.

Ответы [ 3 ]

1 голос
/ 08 апреля 2011

Ваш воспроизводимый пример:

df <- structure(list(V1 = structure(c(1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 3L, 3L), .Label = c("a", "b", "c"), class = "factor"),     V2 = structure(c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,     1L, 2L), .Label = c("a", "b", "c", "d", "e"), class = "factor"),     V3 = c(1L, 3L, 2L, 1L, 3L, 3L, 1L, 8L, 1L, 1L, 2L, 8L)), .Names = c("V1", "V2", "V3"), class = "data.frame", row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"))

И вычислите базовую перекрестную таблицу на основе ваших переменных:

> xtabs(V3~V1+V2, df)
   V2
V1  a b c d e
  a 1 3 2 1 3
  b 3 1 8 1 1
  c 2 8 0 0 0

Надеюсь, вы имели в виду это :)

0 голосов
/ 08 апреля 2011

Другой метод, возможно, несколько более барочный, для расширения кадра данных из третьего столбца на основе первых двух ... с Чейзом, что ОП не дал однозначного описания проблемы:

 df2 <- expand.grid(A=LETTERS[1:5], B=LETTERS[1:5])
 df2$N <- 1:25
 mtx <- outer(X=LETTERS[1:5],Y=LETTERS[1:5], FUN=function(x,y){
                        df2[intersect(which(df2$A==x), which(df2$B==y)), "N"] })
 colnames(mtx)<-LETTERS[1:5]; rownames(mtx)<-LETTERS[1:5]
 mtx
  A  B  C  D  E
A 1  6 11 16 21
B 2  7 12 17 22
C 3  8 13 18 23
D 4  9 14 19 24
E 5 10 15 20 25

Я уверен, что есть много других стратегий, использующих reshape в базе или dcast в reshape2.

0 голосов
/ 08 апреля 2011

Если df - ваш фрейм данных, предполагая, что уникальный V3 сопоставлен с каждой комбинацией V1, V2, вы можете сделать это с помощью

with(df, tapply(V3, list(V1,V2), identity))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...