У меня есть следующий набор данных:
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
Как это сделать? Спасибо
@mtoto dataset1 - это исходные данные, а dataset2 - окончательные данные после обсуждения.
они кажутся мне одинаковыми





Вот один из способов в базе 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))
В примере с tidyr должно ли это быть dataset1 вместо dataset2? (tidyr::complete(dataset1, bnames, events, fill = list(freq = 0)))
гм, если присмотреться, разве dataset1 не идентичен dataset2?
Да, вы правы - извините - мне это не было очевидно при первом чтении вопроса. Хороший пример tidyr::complete BTW +1
Вот решение data.table. Сгенерируйте все возможные перестановки имен bname и событий, оставьте соединение этого набора с исходным набором данных и верните частоту, если она доступна, иначе установите 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
какая разница между
dataset1иdataset2?