data.table (R) вставляет значение из определенной строки при агрегировании по группе - PullRequest
0 голосов
/ 11 июня 2018

Я имею дело с причудливым.У меня есть некоторые данные, например, так:

dt<-data.table(time = c('13:00','13:00','13:00','13:15','13:15'),group=c('A','A','B','A','B'),code=c('11b','16b','22c','9c','7y'))

        time group code
    1: 13:00     A  11b
    2: 13:00     A  16b
    3: 13:00     B  22c
    4: 13:15     A   9c
    5: 13:15     B   7y

Я пытаюсь сделать следующее.Создайте новый столбец (:= Fgroup), который принимает условие для значения group и агрегирует по time.Так что, если group == A, будет достаточно вставить значение в code.Если group == B, мне нужно вставить код (или коды, если их много), которые присутствуют для группы A, по time.

Другими словами:

        time group code Fcode
    1: 13:00     A  11b  11b
    2: 13:00     A  16b  16b
    3: 13:00     B  22c  11b,16b
    4: 13:15     A   9c  9c
    5: 13:15     B   7y  9c

Есть ли простой выход?Спасибо

Ответы [ 2 ]

0 голосов
/ 11 июня 2018

Вы хотите иметь что-то подобное?

library(data.table)

dt[, Fcode := paste(code[group == 'A'], collapse = ","), by = time][group == 'A', Fcode := code]

, что дает

> dt
    time group code   Fcode
1: 13:00     A  11b     11b
2: 13:00     A  16b     16b
3: 13:00     B  22c 11b,16b
4: 13:15     A   9c      9c
5: 13:15     B   7y      9c


Пример данных:

dt <- data.table(time = c('13:00','13:00','13:00','13:15','13:15'),
                 group= c('A','A','B','A','B'),
                 code = c('11b','16b','22c','9c','7y'))
0 голосов
/ 11 июня 2018

Группировка по времени, добавление нового столбца со всеми вставленными значениями кода.Тогда присоедините это к своей оригинальной таблице.Сгруппируйте по времени, сгруппируйте и создайте новый столбец, используя ifelse, чтобы использовать либо код, либо ранее созданный вами столбец

dt <- dt[,.(code_temp=paste(ifelse(group!="B",code,""),collapse=", ")), by="time"][
dt, on="time"][
, Fcode := ifelse(group!="B",code,code_temp)][
group=="B",Fcode := substr(Fcode,1,nchar(Fcode)-2)]

Последний бит кода удаляет завершающую запятую.

Это соответствует вашемуописание проблемы и вывод вашего вопроса, но я не уверен относительно вашей ссылки на группу C и т. д.

...