2017-07-27 56 views
2

我正在嘗試創建一個數據框(BOS.df),以便探究將在接收實際數據之前執行的未來分析的結構。在這種情況下,可以說有4家餐廳希望運行廣告系列(「餐廳」變量)。廣告系列將持續的天數爲cmp.lngth。我需要隨機數字來表示廣告的收費標準(ra.num)。廣告系列在StartDate上開始。最終,我希望通過每個餐廳的週期創建一個數據框,並通過添加行來爲廣告系列的每一天添加隨機結算編號。通過迭代添加行創建數據框

#Create Data Placeholders 
set.seed(123) 
Restaurant <- c('B1', 'B2', 'B3', 'B4') 
cmp.lngth <- 42 
ra.num <- rnorm(cmp.lngth, mean = 100, sd = 10) 
StartDate <- as.Date("2017-07-14") 


BOS.df <- data.frame(matrix(NA, nrow =0, ncol = 3)) 
colnames(BOS.df) <- c("Restaurant", "Billings", "Date") 


for(i in 1:length(Restaurant)){ 
    for(z in 1:cmp.lngth){ 
    BOS.row <- c(as.character(Restaurant[i]),ra.num[z],StartDate + 
    cmp.lngth[z]-1) 
    BOS.df <- rbind(BOS.df, BOS.row) 
    } 
} 

我的代碼現在無法正常工作。列名稱不正確,並且數據沒有正確放置(如果有的話)。輸出結果如下:

X.B1. X.94.3952435344779. X.17402. 
1 B1 94.3952435344779 17402 
2 B1    <NA>  <NA> 
3 B1    <NA>  <NA> 
4 B1    <NA>  <NA> 
5 B1    <NA>  <NA> 
6 B1    <NA>  <NA> 

如何獲得正確的輸出?有沒有比使用for循環更有效的方法?

+0

拼寫錯誤'也無濟於事。 'cmp.lngth [z]'沒有意義,因爲'cmp.lngth'是一個單一的數字,而不是一個矢量 - 你可能只需要'z'在這裏。 –

+0

嘿,安德魯。感謝您的反饋。拼寫錯誤來自我將代碼翻譯成我的提交,以便它不是可以遠程識別的。 –

回答

1

使用expand.grid:在`lenght(Restuarant的)

cmp.lngth <- 2 
StartDate <- as.Date("2017-07-14") 

set.seed(1) 
df1 <- data.frame(expand.grid(Restaurant, seq(cmp.lngth) + StartDate)) 
colnames(df1) <- c("Restaurant", "Date") 
df1$Billings <- rnorm(nrow(df1), mean = 100, sd = 10) 
df1 <- df1[ order(df1$Restaurant, df1$Date), ] 

df1 
# Restaurant  Date Billings 
# 1   B1 2017-07-15 93.73546 
# 5   B1 2017-07-16 103.29508 
# 2   B2 2017-07-15 101.83643 
# 6   B2 2017-07-16 91.79532 
# 3   B3 2017-07-15 91.64371 
# 7   B3 2017-07-16 104.87429 
# 4   B4 2017-07-15 115.95281 
# 8   B4 2017-07-16 107.38325 
+0

謝謝!我收到了一條錯誤消息,但我仍然得到我想要的輸出。 錯誤: '錯誤爲了(NULL,C(17362,17362,17362,17362,17363,17363,17363,: 參數1不是VECTOR' –

+0

工作正常,我從錯誤。我會在運行代碼之前檢查對象Restaurant的類,並且可以通過命名expand.grid()中的變量並擺脫對data.frame的調用來簡化它:'df1 < - expand.grid (餐廳=餐廳,日期= seq(cmp.lngth)+ StartDate)' – atiretoo

+0

謝謝,atootoo!我經歷了這些變化並加入了這些變化,我也檢查了餐廳的類並將其從字符轉換爲因子。 –

0

你可以使用rbind,但這是另一種方法。
另外,數據幀的長度應該是cmp.lngth * length(Restaurant),而不是cmp.lngth。

#Create Data Placeholders 
set.seed(123) 
Restaurant <- c('B1', 'B2', 'B3', 'B4') 
cmp.lngth <- 42 
ra.num <- rnorm(cmp.lngth, mean = 100, sd = 10) 
StartDate <- as.Date("2017-07-14") 


BOS.df <- data.frame(matrix(NA, nrow = cmp.lngth*length(Restaurant), ncol = 3)) 
colnames(BOS.df) <- c("Restaurant", "Billings", "Date") 

count <- 1 
for(name in Restaurant){ 
    for(z in 1:cmp.lngth){ 
     BOS.row <- c(name, ra.num[z], as.character(StartDate + z - 1)) 
     BOS.df[count,] <- BOS.row 
     count <- count + 1 
    } 
} 

我也建議你看一下名爲tidyverse的包,並用tibble代替數據框使用add_row。下面是一個示例代碼:

library(tidyverse) 
BOS.tb <- tibble(Restaurant = character(), 
       Billings = numeric(), 
       Date = character()) 

for(name in Restaurant){ 
    for(z in 1:cmp.lngth){ 
     BOS.row <- c(name, ra.num[z], as.character(StartDate + z - 1)) 
     BOS.tb <- add_row(BOS.tb, 
          Restaurant = name, 
          Billings = ra.num[z], 
          Date = as.character(StartDate + z - 1)) 
    } 
}