2013-07-04 109 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

这真棒,我会试试这个并且回复你们。 –