преобразовать в широкоформатный формат и установить 0, если значение не существует - PullRequest
0 голосов
/ 10 мая 2018

У меня есть следующий набор данных:

dataset1 <- data.frame(
        bnames = c("T1", "T1", "T2", "T3", "T3"),
        events = c("I", "O", "I", "I", "O"),
        freq = c(1,2,3,4,5))

Я хочу преобразовать этот набор данных в широкий формат, мой подход (с использованием пакета reshape):

dataset2 <- melt(dataset1, id.vars = c("bnames", "events"))
dataset2 <- dataset2[c("bnames", "events", "value")]
names(dataset2) <- c("bnames", "events", "freq")

содержание dataset2:

  bnames events freq
1     T1      I    1
2     T1      O    2
3     T2      I    3
4     T3      I    4
5     T3      O    5

Но в столбце bnames всегда должно быть две строки с одинаковыми именами. Одна строка с I и другая с O в столбце events. Если соответствующее значение не существует в исходном наборе данных (dataset1), тогда значение в freq всегда должно быть 0. Поэтому мой желаемый результат в этом случае должен быть:

  bnames events freq
1     T1      I    1
2     T1      O    2
3     T2      I    3
4     T2      O    0
5     T3      I    4
6     T3      O    5

Как это сделать? Спасибо

Ответы [ 2 ]

0 голосов
/ 11 мая 2018

Вот решение data.table. Сгенерируйте все возможные перестановки bnames и событий, оставьте соединение этого набора с исходным набором данных и верните частоту, если она доступна, иначе установите на 0.

library(data.table)
setDT(dataset1)[CJ(bnames=bnames, events=events, unique=TRUE), 
    .(freq=ifelse(is.na(freq), 0, freq)), 
    by=.EACHI, 
    on=.(bnames, events)]

#   bnames events freq
#1:     T1      I    1
#2:     T1      O    2
#3:     T2      I    3
#4:     T2      O    0
#5:     T3      I    4
#6:     T3      O    5
0 голосов
/ 10 мая 2018

Вот один из способов в базе R:

left_hand <- expand.grid(
        bnames = unique(dataset1$bnames), 
        events = c("I", "O"), 
        stringsAsFactors = FALSE
      )

dataset2 <- merge(left_hand, dataset2, all.x = TRUE)
dataset2[is.na(dataset2)] <- 0

Кроме того, в пакете tidyr имеется однострочник:

tidyr::complete(dataset2, bnames, events, fill = list(freq = 0))
...