Во-первых, приведите данные в воспроизводимую форму (я использовал dput()
на original.data
, что я прочитал из того, что у вас было, и сделал некоторые преобразования). Это гарантирует, что все типы данных являются правильными (date
имеет тип Date
, а id
- это factor
и т. Д .; эти вещи актуальны.)
original.data <-
structure(list(label = c(1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L,
5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L, 1L, 2L, 3L, 4L, 5L,
1L, 2L, 3L, 4L, 5L), date = structure(c(15350, 15350, 15350,
15350, 15350, 15357, 15357, 15357, 15357, 15357, 15364, 15364,
15364, 15364, 15364, 15371, 15371, 15371, 15371, 15371, 15378,
15378, 15378, 15378, 15378, 15385, 15385, 15385, 15385, 15385
), class = "Date"), special = c(0L, 1L, 0L, 0L, 0L, 0L, 0L, 0L,
1L, 1L, 1L, 1L, 0L, 1L, 1L, 0L, 1L, 1L, 0L, 0L, 0L, 0L, 0L, 1L,
0L, 1L, 1L, 0L, 1L, 0L), size = c(10L, 20L, 10L, 30L, 10L, 10L,
20L, 10L, 30L, 10L, 10L, 20L, 10L, 30L, 10L, 10L, 20L, 10L, 30L,
10L, 10L, 20L, 10L, 30L, 10L, 10L, 20L, 10L, 30L, 10L), id = structure(c(1L,
1L, 2L, 3L, 3L, 1L, 1L, 2L, 3L, 3L, 1L, 1L, 2L, 3L, 3L, 1L, 1L,
2L, 3L, 3L, 1L, 1L, 2L, 3L, 3L, 1L, 1L, 2L, 3L, 3L), .Label = c("A",
"B", "C"), class = "factor")), .Names = c("label", "date", "special",
"size", "id"), row.names = c(NA, -30L), class = "data.frame")
Далее вы хотите выполнить обработку «В ту же дату». Это подразумевает стратегию разделения-применения-объединения. Библиотека plyr
хорошо с этим справляется.
library("plyr")
Вы хотите ddply
(data.frame
in, data.frame
out) и вам нужна функция, которая выполняет ваши преобразования для подмножества данных, которое соответствует одной дате.
Используя ваши первые два примера (idEffectA и sizeEffect10), реализация ваших правил будет выглядеть следующим образом:
ddply(original.data, .(date), function(DF) {
# idEffectA
others <- if(any(DF$special[DF$id == "A"] == 1)) {1} else {0}
DF$idEffectA <- ifelse(DF$id == "A", 0, others)
# sizeEffect10
others <- if(any(DF$special[DF$size == 10] == 1)) {1} else {0}
DF$sizeEffect10 <- ifelse(DF$size == 10, 0, others)
DF
})
Для idEffectA
, others
проверяет, являются ли какие-либо из значений special
, соответствующих значению A
, 1
и равны 1
, если это так, 0
в противном случае. Тогда присвоение idEffectA
зависит от того, является ли оно A
(0
) или нет (каким бы ни было others
). Повторите логику для размера, но сравнивая с числом.
Ваш дальнейший пример показывает, что вы хотите столбец для каждого возможного значения id
и size
. Петли могут доставить вас туда.
allid <- levels(original.data$id)
allsize <- unique(original.data$size)
ddply(original.data, .(date), function(DF) {
for (e in allid) {
others <- if(any(DF$special[DF$id == e] == 1)) {1} else {0}
DF[[paste("idEffect",e,sep="")]] <- ifelse(DF$id == e, 0, others)
}
for (e in allsize) {
others <- if(any(DF$special[DF$size == e] == 1)) {1} else {0}
DF[[paste("sizeEffect",e,sep="")]] <- ifelse(DF$size == e, 0, others)
}
DF
})
, что дает
label date special size id idEffectA idEffectB idEffectC sizeEffect10 sizeEffect20 sizeEffect30
1 1 2012-01-11 0 10 A 0 0 0 0 1 0
2 2 2012-01-11 1 20 A 0 0 0 0 0 0
3 3 2012-01-11 0 10 B 1 0 0 0 1 0
4 4 2012-01-11 0 30 C 1 0 0 0 1 0
5 5 2012-01-11 0 10 C 1 0 0 0 1 0
6 1 2012-01-18 0 10 A 0 0 1 0 0 1
7 2 2012-01-18 0 20 A 0 0 1 1 0 1
8 3 2012-01-18 0 10 B 0 0 1 0 0 1
9 4 2012-01-18 1 30 C 0 0 0 1 0 0
10 5 2012-01-18 1 10 C 0 0 0 0 0 1
11 1 2012-01-25 1 10 A 0 0 1 0 1 1
12 2 2012-01-25 1 20 A 0 0 1 1 0 1
13 3 2012-01-25 0 10 B 1 0 1 0 1 1
14 4 2012-01-25 1 30 C 1 0 0 1 1 0
15 5 2012-01-25 1 10 C 1 0 0 0 1 1
16 1 2012-02-01 0 10 A 0 1 0 0 1 0
17 2 2012-02-01 1 20 A 0 1 0 1 0 0
18 3 2012-02-01 1 10 B 1 0 0 0 1 0
19 4 2012-02-01 0 30 C 1 1 0 1 1 0
20 5 2012-02-01 0 10 C 1 1 0 0 1 0
21 1 2012-02-08 0 10 A 0 0 1 0 0 1
22 2 2012-02-08 0 20 A 0 0 1 0 0 1
23 3 2012-02-08 0 10 B 0 0 1 0 0 1
24 4 2012-02-08 1 30 C 0 0 0 0 0 0
25 5 2012-02-08 0 10 C 0 0 0 0 0 1
26 1 2012-02-15 1 10 A 0 0 1 0 1 1
27 2 2012-02-15 1 20 A 0 0 1 1 0 1
28 3 2012-02-15 0 10 B 1 0 1 0 1 1
29 4 2012-02-15 1 30 C 1 0 0 1 1 0
30 5 2012-02-15 0 10 C 1 0 0 0 1 1
Я предварительно вычисляю возможные значения id
и size
(allid
и allsize
), поскольку это нужно сделать только один раз. Внутри функции для каждой даты выполните итерации по каждому возможному значению id
. Постройте столбцы «Эффект» таким же образом, но с помощью paste
создайте имя столбца.