Слияние и добавление строк в рамках данных в R

Я прочитал многие темы и не думаю, что мой вопрос задавался раньше. у меня есть data.frame в R, связанные с рекламными объявлениями, показанными клиентам как таковые:.. У меня много клиентов, 8 различных продуктов.. так что это всего лишь образец

mydf <- data.frame(Cust = c(1, 1), age = c(24, 24), 
    state = c("NJ", "NJ"), Product = c(1, 1), cost = c(400, 410), 
    Time = c(35, 25), Purchased = c("N", "Y"))
mydf
#   Cust age state Product cost Time Purchased
# 1    1  24    NJ       1  400   35         N
# 2    1  24    NJ       1  410   23         Y

И я хочу, чтобы это выглядело так...

Cust | age | state | Product | cost.1 | time.1 | purch.1 | cost.2 | time.2 | purch.2
   1 |  24 |    NJ |       1 |    400 |     35 |       N |    410 |     23 |       Y

Как я могу это сделать? Есть несколько статических переменных для каждого клиента, таких как возраст, состояние и несколько других... и затем есть детали, связанные с каждым предложением, которое было представлено данному клиенту, номер продукта в предложении, стоимость, время, и если они приобрели его... я хочу, чтобы все это было в одной строке для каждого клиента, чтобы выполнить анализ.

Стоит отметить, что количество товаров максимально достигает 7, но для некоторых клиентов оно колеблется от 1 до 7.

У меня нет примера кода, чтобы действительно показать. Я пытался использовать aggregate функция, но я не хочу агрегировать или делать какие-либо суммы. Я просто хочу сделать несколько соединений. Исследования показывают, что cbind, а также tapply функции могут быть полезны.

Спасибо за помощь. Я очень плохо знаком с Р.

1 ответ

Решение

По сути, вы просите сделать "длинную" или "широкую" перестройку ваших данных.

Мне кажется, что вы используете "Cust", "age", "state" и "Product" в качестве переменных идентификатора. Однако у вас нет фактической переменной времени ("время", как при последовательном подсчете записей по идентификаторам, указанным выше). Однако такую ​​переменную легко создать:

mydf$timevar <- with(mydf, 
                     ave(rep(1, nrow(mydf)), 
                         Cust, age, state, Product, FUN = seq_along))
mydf
#   Cust age state Product cost Time Purchased timevar
# 1    1  24    NJ       1  400   35         N       1
# 2    1  24    NJ       1  410   23         Y       2

Оттуда это довольно просто с reshape функция в базе R.

reshape(mydf, direction = "wide", 
        idvar=c("Cust", "age", "state", "Product"),
        timevar = "timevar")
#   Cust age state Product cost.1 Time.1 Purchased.1 cost.2 Time.2 Purchased.2
# 1    1  24    NJ       1    400     35           N    410     23           Y
Другие вопросы по тегам