изменение формы данных (более быстрый способ)

Я наткнулся на таблицу частот. сегодня мне пришлось расшириться до фрейма данных необработанных значений. Я смог это сделать, но мне было интересно, есть ли более быстрый способ использования пакета reshape или data.table?

Первоначальная таблица выглядела так:

   i1 i2 i3 i4  m  f
1   0  0  0  0 22 29
2   1  0  0  0 30 50
3   0  1  0  0 13 15
4   0  0  1  0  1  6
5   1  1  0  0 24 67
6   1  0  1  0  5 12
7   0  1  1  0  1  2
8   1  1  1  0 10 22
9   0  0  0  1 10  7
10  1  0  0  1 27 30
11  0  1  0  1 14  4
12  0  0  1  1  1  0
13  1  1  0  1 54 63
14  1  0  1  1  8 10
15  0  1  1  1  8  6
16  1  1  1  1 57 51

Вот простое получение данных с помощью dput:

dat <- structure(list(i1 = c(0L, 1L, 0L, 0L, 1L, 1L, 0L, 1L, 0L, 1L, 
0L, 0L, 1L, 1L, 0L, 1L), i2 = c(0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L, 
0L, 0L, 1L, 0L, 1L, 0L, 1L, 1L), i3 = c(0L, 0L, 0L, 1L, 0L, 1L, 
1L, 1L, 0L, 0L, 0L, 1L, 0L, 1L, 1L, 1L), i4 = c(0L, 0L, 0L, 0L, 
0L, 0L, 0L, 0L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L), m = c(22L, 30L, 
13L, 1L, 24L, 5L, 1L, 10L, 10L, 27L, 14L, 1L, 54L, 8L, 8L, 57L
), f = c(29L, 50L, 15L, 6L, 67L, 12L, 2L, 22L, 7L, 30L, 4L, 0L, 
63L, 10L, 6L, 51L)), .Names = c("i1", "i2", "i3", "i4", "m", 
"f"), class = "data.frame", row.names = c(NA, -16L))

Мой подход(ы) к изменению формы данных (есть ли более быстрый способ?):

#step 1: method 1 (in this case binding and stacking uses less code than reshape)
dat2 <- data.frame(rbind(dat[,1:4], dat[, 1:4]), 
    sex = rep(c('m', 'f'), each=16),
    n = c(dat$m, dat$f))
dat2

#step 1: method 2    
dat3 <- reshape(dat, direction = "long", idvar = 1:4,
    varying = list(c("m", "f")),
    v.names = c("n"),
    timevar = "sex",
    times = c("m", "f"))
    rownames(dat3) <- 1:nrow(dat3)
    dat3 <- data.frame(dat3)
    dat3$sex <- as.factor(dat3$sex)

all.equal(dat3, dat2) #just to show both method 1 and 2 give the same data frame

#step 2
dat4 <- dat2[rep(seq_len(nrow(dat2)), dat2$n), 1:5]
rownames(dat4) <- 1:nrow(dat4)
dat4

Я предполагаю, что это это распространенная проблема, когда вы хотите взять таблицу из статьи и воспроизвести ее, она требует некоторой распаковки. Я обнаруживаю, что делаю это все больше и больше, и хочу быть уверенным, что работаю эффективно.

5
задан Matt Dowle 5 October 2012 в 09:07
поделиться