2015-07-08 2 views
5

क्षमा करें अगर इससे पहले पूछा गया है, लेकिन मुझे कोई प्रश्न नहीं मिला जो वास्तव में इसका उत्तर देता है। मेरे पास इस तरह का डेटा है:समूहों के भीतर (टी -1) डेटा प्राप्त करें

Project  Date price 
     A 30/3/2013 2082 
     B 19/3/2013 1567 
     B 22/2/2013 1642 
     C 12/4/2013 1575 
     C 5/6/2013 1582 

मैं समूह द्वारा अंतिम-उदाहरण की कीमतों के साथ एक कॉलम रखना चाहता हूं। उदाहरण के लिए, पंक्ति 2 के लिए, एक ही समूह के लिए पिछले उदाहरण कीमत 1642 हो जाएगा अंतिम डेटा कुछ हद तक इस तरह दिखेगा:

Project  Date price lastPrice 
     A 30/3/2013 2082   0 
     B 19/3/2013 1567  1642 
     B 22/2/2013 1642   0 
     C 12/4/2013 1575   0 
     C 5/6/2013 1582  1575 

यह कैसे करना है? मुझे जिस मुख्य मुद्दे का सामना करना पड़ रहा है वह यह है कि डेटा को तिथि के अनुसार आदेश नहीं दिया जा सकता है, ऐसा नहीं है कि मैं केवल अंतिम सेल ले सकता हूं।

+0

किसी भी कारण से सरणी को फिर से ऑर्डर करने का कोई कारण नहीं है, अपना फ़ंक्शन चलाएं, और फिर इच्छित होने पर ऑर्डरिंग को उलट दें? –

उत्तर

7

यहां एक विकल्प है। 0 यदि 0 वास्तविक मूल्य हो सकता है तो मैं NA एस का उपयोग करने की भी सिफारिश करता हूं।

library(dplyr) 
df %>% 
    arrange(as.Date(Date, format = "%d/%m/%Y")) %>% 
    group_by(Project) %>% 
    mutate(lastPrice = lag(price)) 

# Source: local data frame [5 x 4] 
# Groups: Project 
# 
# Project  Date price lastPrice 
# 1  B 22/2/2013 1642  NA 
# 2  B 19/3/2013 1567  1642 
# 3  A 30/3/2013 2082  NA 
# 4  C 12/4/2013 1575  NA 
# 5  C 5/6/2013 1582  1575 

एक अन्य विकल्प data.table

library(data.table) ## v >= 1.9.5 
setDT(df)[order(as.Date(Date, format = "%d/%m/%Y")), 
       lastPrice := shift(price), 
       by = Project] 

# Project  Date price lastPrice 
# 1:  A 30/3/2013 2082  NA 
# 2:  B 19/3/2013 1567  1642 
# 3:  B 22/2/2013 1642  NA 
# 4:  C 12/4/2013 1575  NA 
# 5:  C 5/6/2013 1582  1575 

की या आधार आर के साथ the devel version से shift उपयोग करने के लिए है

df <- df[order(df$Project, as.Date(df$Date, format = "%d/%m/%Y")), ] 
within(df, lastPrice <- ave(price, Project, FUN = function(x) c(NA, x[-length(x)]))) 
# Project  Date price lastPrice 
# 1  A 30/3/2013 2082  NA 
# 3  B 22/2/2013 1642  NA 
# 2  B 19/3/2013 1567  1642 
# 4  C 12/4/2013 1575  NA 
# 5  C 5/6/2013 1582  1575 

एक साइड नोट के रूप में, अपने दिनांक कॉलम को पहले स्थान पर Date कक्षा में रखना बेहतर है, इसलिए मैं एक बार और सभी के लिए df$Date <- as.Date(df$Date, format = "%d/%m/%Y") करने की अनुशंसा करता हूं।

+1

यह काम करता है! और पूरी तरह से साफ .. एक टन धन्यवाद! :) – UD1989

+1

बहुत बुरा मैं जवाब के लिए एक अलग +1 नहीं दे सकता और दूसरा दिनांक 'तिथि' वर्ग को सेट करने के बारे में उत्कृष्ट सलाह के लिए नहीं दे सकता। –

संबंधित मुद्दे