2016-08-10 3 views
1

Это то, что мои данные кадр выглядит следующим образом:наклеивая все предыдущие элементы столбца как из строки с наибольшим количеством очков

library(data.table) 
dt <- fread(' 
    Product Score Description 
    A   1   aapl 
    A   2   banana 
    A   3   orange 
    B   1   coke 
    B   2   pepsi 
    C   1   butter 
    D   1   milk 
') 

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

Product Score(Max) Description2 
    A   3   aapl;banana;orange 
    B   2   coke;pepsi 
    C   1   butter 
    D   1   milk 

Я попытался

dt[,Description2 := as.character(ifelse(!max(Score),NA,paste(shift(Description,1), 
Description,sep=";"))),by=Product] 

Ваша помощь приветствуется!

ответ

1

Мы группируем «Продукт», получаем max «Оценка» и paste «Описание» вместе с collapse = ";".

dt[, .(ScoreMax = max(Score), Description2 = paste(Description, collapse=";")), 
      by = .(Product)] 
# Product ScoreMax  Description2 
#1:  A  3 aapl;banana;orange 
#2:  B  2   coke;pepsi 
#3:  C  1    butter 
#4:  D  1    milk 

Использование := (назначение) создает новый столбец в исходном наборе данных. Для обобщения мы можем сохранить его в list или просто использовать .( после группировки по переменной.

+0

Спасибо за ваш ответ! Какова цель периода infront продукта, например. (Product)? – gibbz00

+1

@ gibbz00 В этом нет необходимости. Вы можете просто использовать 'by = Product'. Но я использовал это для общего назначения, если у вас более одной переменной группировки. Это иначе 'by = list (Product)' – akrun

Смежные вопросы