주문 날짜, 사용자 ID 및 항목 ID로 구성된 큰 데이터 프레임이 있다고 가정 해 보겠습니다.
order_id order_date user_id item_id
1 1 2016-06-22 30822 643
2 2 2016-06-22 30822 337
3 3 2016-06-22 30823 270
4 4 2016-06-22 30823 142
5 5 2016-06-22 30823 561
6 6 2016-06-22 30823 561
7 7 2016-06-22 30823 72
8 8 2016-06-22 30823 106
9 9 2016-06-22 30823 195
10 10 2016-06-22 30823 195
내가 원하는 것은 같은 사용자가 같은 날에 주문한 횟수와 같은 사용자가 같은 항목을 주문한 횟수를 세어 네 번째와 다섯 번째 열에 두 값을 표시하는 것입니다. 따라서 결과는 다음과 같아야합니다.
order_id order_date user_id item_id same_day same_item
1 1 2016-06-22 30822 643 2 1
2 2 2016-06-22 30822 337 2 1
3 3 2016-06-22 30823 270 8 1
4 4 2016-06-22 30823 142 8 1
5 5 2016-06-22 30823 561 8 2
6 6 2016-06-22 30823 561 8 2
7 7 2016-06-22 30823 72 8 1
8 8 2016-06-22 30823 106 8 1
9 9 2016-06-22 30823 195 8 2
10 10 2016-06-22 30823 195 8 2
또는 항목이 두 번 이상 주문되었는지 여부를 표시하는 이진 변수도 작업을 수행합니다. 다음을 사용하여 각 행에 대해 쉽게 계산할 수 있음을 알고 있습니다 sum()
.
> sum(df$order_date=="2016-06-22" & df$user_id==30823)
[1] 8
> sum(df$item_id==561 & df$user_id==30823)
[1] 2
하지만 차라리 자동으로 실행되고 수천 개의 항목에 대해 수동으로 수행해야합니다. 나는 진지하게 아이디어가 부족 하고 당신의 도움에 매우 감사 할 것입니다!
library(data.table)
setDT(df)
df[, same_day := .N, by = .(order_date, user_id)]
df[, same_item := .N, by = .(order_date, user_id, item_id)]
df
# order_id order_date user_id item_id same_day same_item
# 1: 1 2016-06-22 30822 643 2 1
# 2: 2 2016-06-22 30822 337 2 1
# 3: 3 2016-06-22 30823 270 8 1
# 4: 4 2016-06-22 30823 142 8 1
# 5: 5 2016-06-22 30823 561 8 2
# 6: 6 2016-06-22 30823 561 8 2
# 7: 7 2016-06-22 30823 72 8 1
# 8: 8 2016-06-22 30823 106 8 1
# 9: 9 2016-06-22 30823 195 8 2
# 10: 10 2016-06-22 30823 195 8 2
또는 dplyr
library(dplyr)
df <-
df %>%
add_count(order_date, user_id, name = 'same_day') %>%
add_count(order_date, user_id, item_id, name = 'same_item')
df
# # A tibble: 10 x 6
# order_id order_date user_id item_id same_day same_item
# <int> <chr> <int> <int> <int> <int>
# 1 1 2016-06-22 30822 643 2 1
# 2 2 2016-06-22 30822 337 2 1
# 3 3 2016-06-22 30823 270 8 1
# 4 4 2016-06-22 30823 142 8 1
# 5 5 2016-06-22 30823 561 8 2
# 6 6 2016-06-22 30823 561 8 2
# 7 7 2016-06-22 30823 72 8 1
# 8 8 2016-06-22 30823 106 8 1
# 9 9 2016-06-22 30823 195 8 2
# 10 10 2016-06-22 30823 195 8 2
이 기사는 인터넷에서 수집됩니다. 재 인쇄 할 때 출처를 알려주십시오.
침해가 발생한 경우 연락 주시기 바랍니다[email protected] 삭제
몇 마디 만하겠습니다