2016-11-15 22 views
0

注文日の列と電子メールに基づいて新しいdata_frameを作成しようとしています。したがって、重複した電子メール(例:下の例では[email protected])がある場合は、電子メールをマージして、order_date変数をその横の新しい列に配置します。私は完全なDFでこれをしたい。これは多くのNAsを紹介しますが、私は後でその問題を解決します。別の列(メール)に基づく分割列(日付)

次のように私は、データフレームを持っている:私は取得したい何

Source: local data frame [6 x 4] 
Groups: email [5] 

       email order_date `sum(price_excl_vat_euro)` `sum(total_qty)` 
       <chr>  <date>      <dbl>   <int> 
1 [email protected] 2016-09-05      140.48    2 
2 [email protected] 2016-11-01      41.31    1 
3 [email protected] 2016-09-18      61.98    1 
4 [email protected] 2016-08-01      61.98    1 
5 [email protected] 2016-08-02      61.98    1 
6 [email protected] 2016-08-02      140.49    1 

は(私は今のところ気にしない他の列)である:

email   order_date1 order_date2 
[email protected] 2016-09-05  NA 
[email protected] 2016-11-01  NA 
[email protected] 2016-09-18  NA 
[email protected] 2016-08-01  2016-08-02 
[email protected] 2016-08-02  NA 

それを知ることが重要です注文数は1〜10(平均)の間で変動する可能性があります。私はtidyrパッケージからspread関数を試しました。しかし、それを働かせることはできませんでした。ヒントは非常に高く評価されています!例えば

答えて

3

df <- read.table(row.names=1, stringsAsFactors = F, text=" 
1 [email protected] 2016-09-05      140.48    2 
2 [email protected] 2016-11-01      41.31    1 
3 [email protected] 2016-09-18      61.98    1 
4 [email protected] 2016-08-01      61.98    1 
5 [email protected] 2016-08-02      61.98    1 
6 [email protected] 2016-08-02      140.49    1") 
df <- df[order(df[,1], df[,2]), ] 
lst <- split(df[,2],df[,1]) 
do.call(rbind, lapply(lst, "length<-", max(lengths(lst)))) 
#     [,1]   [,2]   
# [email protected] "2016-08-01" "2016-08-02" 
# [email protected] "2016-08-02" NA   
# [email protected] "2016-11-01" NA   
# [email protected] "2016-09-05" NA   
# [email protected] "2016-09-18" NA  

または

library(tidyverse) 
df %>% 
    arrange(V2, V3) %>% 
    group_by(V2) %>% 
    transmute(V3, date=paste0("date", 1:n())) %>% 
    spread(date, V3) 
# Source: local data frame [5 x 3] 
# Groups: V2 [5] 
# 
#    V2  date1  date2 
# *   <chr>  <chr>  <chr> 
# 1 [email protected] 2016-08-01 2016-08-02 
# 2 [email protected] 2016-08-02  <NA> 
# 3 [email protected] 2016-11-01  <NA> 
# 4 [email protected] 2016-09-05  <NA> 
# 5 [email protected] 2016-09-18  <NA> 
+0

おかげで、これは確かに動作します。他の列をどのように保つことができるか教えてください。アレンジするためにそれらを追加すると推測すると、仕事をする必要があります。 –

+0

それらを合計して後でマージします(たとえば)。または:新しい質問を投稿し、正確な出力を指定してください(わからない) – lukeA

+0

よく分けた後、私は注文が2回あると言います。したがって、そのユーザーからの電子メールは、order_dateが1行目date1と2行目date2に入力される2行として表示されます。複数の注文がある場合は、3行目の日付3に進みます。基本的に私はこれらの列をtransaction_idsに基づいて1にマージしたい –

関連する問題