2013-07-04 67 views
0

我在做分析,其中必須爲一大批分發者生成一組交叉表。數據處於客戶級別,每個客戶都映射到分銷商。由於分銷商的數量很大,我正試圖自動化這一過程。在運行時在R中創建數據幀(動態)

我陷在基於發送者ID

這裏動態創建的數據幀是什麼,我想:

for (i in 1:length(DiD)){ #vector comprising list of distributors 
    paste("use",DiD[[1]],sep="_") <- subset(master table, Field1=="NA"& Field2=="valid" & Field3==as.character(DiD[[1]])) 
} 

附加信息:

DiD[[1]] = 1234 

所需輸出: 其通過Field1Field2和由DiD=1234

錯誤時拋出包含主數據的子集的數據幀use_1234 與色漿部面臨的問題,以及與指定Field3作爲DiD[[1]]

Error in eval(expr, envir, enclos) : 
dims [product 1] do not match the length of object [529] 

希望我已經提供了足夠的信息。萬分感謝!

PS:道歉如果問題已在論壇中回答,我找不到它。

+0

你可能想看看'assign'。另外,最好避免使用'subset',而使用'''。 – Thomas

+0

謝謝@Thomas,我會檢查分配。另一個問題是動態創建數據框名稱。任何關於可能出現問題的觀點? –

+0

@agstudy使用'assign'給了你一個很好的答案,這可能會解決你的問題。 – Thomas

回答

0

我想你也可以解決這個使用split

dfs <- 
split(master.table[master.table$Field1=="NA" & # probably should be is.na(master.table$Field1), but we don't have the data 
        master.table$Field2=="valid",], Field3) 
1

沒有必要在這裏使用for,子集將產生一個data.frame:

那麼你可以使用assign

assign(paste("use",DiD[[1]],sep="_"),res) 

我想,你需要這樣的事情,假設DiD是一個名稱列表:

list.df <- lapply(DiD, function(x) subset(master.table,is.na(Field1) & 
          Field2=="valid" & 
          Field3==as.character(x))) 
names(list.df) <- DiD 

This將創建一個data.frames的命名列表。

+0

謝謝@agstudy。我將嘗試在for循環中包含2個代碼片段來處理所有數據幀。DiD [1:n] –

+0

@RaamaVi不需要,使用'lapply'是一個循環,因此DiD是一個data.frame或一個列表?你可以添加'str(DiD)' – agstudy

+0

這真棒,我會試試這個並且回覆你們。 –