簡體   English   中英

分組並檢查R中的條件

[英]Grouping and checking for a condition in R

我有兩個表: restaurant_transrestaurant_master

restaurant_trans具有名稱,日期,net_sales

這是一個交易文件,其中記錄了50家餐廳的銷售情況,每個餐廳記錄了30天(1500磅)。

restaurant_master名稱為go.live.date,專營權

這是一個帶有餐廳名稱的主文件,“ go.live.date”是餐廳中特定設備的安裝日期。

我想查找安裝該設備前后餐廳的凈銷售額。 我首先要對數據進行分組。

我嘗試使用此代碼對數據進行分組

dummayvar = 0;

for (i in 1:nrow(restaurant_master)){
  for (j in 1:nrow(restaurant_trans)){
    if(restaurant_trans$Restaurant.Name[j]==restaurant_master$Restaurant.Name[i]){
      if(restaurant_trans$Date[j] < restaurant_master$Go.Live.Date[i]){
      append(dummayvar, restaurant_trans$Date)
      }
    }
  }
}

這給出了一個錯誤:

“因素的水平集不同”

請幫忙!!

考慮使用merge()而不是嵌套的for循環。 只需按名稱合並餐廳netsalesmaster數據框,然后根據凈銷售日期和主數據netsales合並子數據框。 最后,按餐廳名稱和特許經營權或單獨匯總銷售凈額。

# DATA FRAME EXAMPLES
netsales <- data.frame(name=c('A', 'A', 'A', 'A', 'A',
                              'B', 'B', 'B', 'B', 'B',
                              'C', 'C', 'C', 'C', 'C'),
              date=c('6/1/2015', '6/15/2015', '7/1/2015', '9/1/2015', '11/15/2015', 
                     '6/5/2015', '6/20/2015', '7/15/2015', '8/1/2015', '10/15/2015',
                     '6/10/2015', '7/10/2015', '8/15/2015', '9/20/2015', '9/30/2015'),
              net_sales=c(1500,  600,  1200,  850,  750,  
                          1120,  560,  720,  340,  890,  
                          1150,  410,  300,  250,  900))    
netsales$date <- as.Date(strptime(netsales$date, '%m/%d/%Y'))
str(netsales)    

master <- data.frame(name=c('A', 'B', 'C'),
                     go.live.date=c('7/25/2015', '8/1/2015', '7/1/2015'),
                     franchise=c('R Co.', 'Python, Inc.', 'C# Ltd.'))

master$go.live.date <- as.Date(strptime(master$go.live.date, '%m/%d/%Y'))
str(master)    

# MERGE AND AGGREGATE BEFORE GO LIVE SALES
beforelive <- merge(netsales, master, by='name')
beforelive <- beforelive[beforelive$date < beforelive$go.live.date,]

beforelivesales <- aggregate(net_sales ~ name + franchise, beforelive, FUN=sum)

# MERGE AND AGGREGATE AFTER GO LIVE SALES
afterlive <- merge(netsales, master, by='name')
afterlive <- afterlive[afterlive$date >= afterlive$go.live.date,]

afterlivesales <- aggregate(net_sales ~ name + franchise, afterlive, FUN=sum)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM