2015-10-14 11 views
-1

我搜索Tidyr和Dplyr標籤上這個網站,並在谷歌兩天左右,最後決定後出於無奈....龍寬 - 重複列

,我有以下的數據幀:

Name  Date Sheets Location Weekday_vs_weekend Cost 
Jake Aug 28 2   House   Weekday  .18 
Jake Aug 28 1   House   Weekday  .09 
Kobe Aug 28 3   Park    Weekend  .27 
Kobe Aug 28 2   Park    Weekend  .18 
Jake Aug 29 1   Library   Weekend  .09 
Jordan Aug 29 8   Library   Weekend  .72 
Jordan Aug 29 4   Library   Weekday  .36 

我想要的日期變量變成列(I可以用擴散(這樣做),提供的總成本通過集合體()中,使用片材列的總金額的合計金額和片材PER日期作爲將日期變量轉換爲列之後使用的值,然後讓日期列中的每個日期重複其餘變量。

Name Aug 28 Cost Location WkDay_WkEnd Aug 29 Cost Location WkDay_WkEnd 
Jake  3  27  House  Weekday   1 .09 Library  Weekday 
Kobe  5  45  Park  Weekday  NA  NA  NA   NA 
Jordan NA  NA  NA   NA   12 1.08 Library  Weekend 
+0

你能告訴我們所有你想做的事情嗎?恐怕我不能在這個問題上跟着你。多一個。請問爲什麼你有約旦和科比的新手?我沒有看到它背後的邏輯。 – jazzurro

+0

我有約旦的NA,因爲喬丹在8月28日沒有打印任何東西,我有科比的NA,因爲他沒有在8月29日打印 – JDiaz

+0

感謝。 :) – jazzurro

回答

3

下面是使用data.table軟件包的可能方法。雖然我看不出你將如何使用如此廣泛的格式。

這裏的想法是要總結的數字列,然後運行在非數字unique,然後簡單的用這樣的數據集採用tidyr兩個

的主要問題之間的連接是spread不有fun.aggregate屬性

library(data.table) # V 1.9.6+ 
indx <- sapply(df[names(df)[-(1:2)]], is.numeric) 

DT1 <- dcast(setDT(df), 
     Name ~ Date, 
     value.var = names(df)[-(1:2)][indx], 
     sum, 
     fill = NA) 

DT2 <- dcast(df, 
     Name ~ Date, 
     value.var = names(df)[-(1:2)][!indx], 
     unique, 
     fill = NA) 

DT1[DT2, on = "Name"] 
#  Name Sheets_sum_Aug 28 Sheets_sum_Aug 29 Cost_sum_Aug 28 Cost_sum_Aug 29 Location_unique_Aug 28 Location_unique_Aug 29 
# 1: Jake     3     1   0.27   0.09     House    Library 
# 2: Jordan    NA    12    NA   1.08      NA    Library 
# 3: Kobe     5    NA   0.45    NA     Park      NA 
# Weekday_vs_weekend_unique_Aug 28 Weekday_vs_weekend_unique_Aug 29 
# 1:       Weekday       Weekend 
# 2:        NA       Weekday 
# 3:       Weekend        NA 
+0

直到現在我還沒有意識到「on」選項。感謝那。 – jazzurro

+0

@jazzurro是啊,它是v 1.9.6+中的一個新功能(這就是爲什麼在'library'上添加這個功能的原因) –