【问题标题】:creating data frame in R at runtime (Dynamically)在运行时在 R 中创建数据框(动态)
【发布时间】:2013-07-04 14:56:14
【问题描述】:

我正在进行分析,其中必须为大量分销商生成一组交叉表。数据位于客户级别,每个客户都映射到分销商。由于分销商的数量很大,我正在尝试使流程自动化。

我陷入了基于分销商 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

期望的输出: 一个数据框use_1234,其中包含Field1Field2DiD=1234 的主数据子集

引发的错误: 粘贴部分也面临问题,将Field3 指定为DiD[[1]]

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

我希望我提供了足够的信息。非常感谢!

PS:如果问题已经在论坛中得到解答,我无法找到。

【问题讨论】:

  • 你可能想看看assign。此外,最好避免使用subset,而是使用[
  • 谢谢@Thomas,我会检查分配。另一个问题是动态创建数据框名称。对那里可能出现的问题有何看法?
  • @agstudy 使用assign 给了你一个很好的答案,这可能会解决你的问题。
  • 我会尝试@agstudy,我会添加一些虚拟表以使问题更清晰。感谢您的建议。一旦我破解了这个,我也会添加一个答案

标签: r dynamic for-loop dataframe


【解决方案1】:

这里不用for,subset会生成一个data.frame:

 res <- subset(master.table,Field1== NA & 
                            Field2=="valid" & 
                            Field3==as.character(DiD[[1]])) 

那么你可以使用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

这将创建一个命名的 data.frames 列表。

【讨论】:

  • 谢谢@agstudy。我将尝试在 for 循环中包含 2 个代码片段来处理所有数据帧 DiD[1:n]
  • @RaamaVi 不需要,使用 lapply 是一个循环,那么 DiD 是一个 data.frame 还是一个列表?可以加str(DiD)
  • 这太棒了,我会试试这个然后回复你们。
【解决方案2】:

我想你也可以使用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)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2012-07-02
    • 1970-01-01
    • 2020-05-04
    相关资源
    最近更新 更多