【问题标题】:plyr within loop: unexpected behaviorplyr 循环内:意外行为
【发布时间】:2014-08-13 10:55:50
【问题描述】:

在循环中使用 plyr 时,我发现了一个奇怪的问题。 我想用这个脚本执行的是用不同的输入值(由 for 循环提供)迭代 plyr 函数并将结果存储为 data.frames 列表。

k=as.factor(c(rep("a",2), rep("b",2), rep("c",2), rep("d",2), rep("e",2)))
indata=data.frame(k)

outdata<-list()
for (i in 1:10){
  tempdata<-ddply(.data = indata, .variables = .(k), .fun = summarize, i=i)
  data[[i]]<-tempdata
  rm(tempdata)
}
data

我希望它生成一个 data.frames 列表,每个数据帧都在循环的单次迭代中生成,因此是循环变量的单个值。 相反,每个 data.frames 看起来都是一样的,每一行都有一个循环变量的顺序值。

将循环变量存储到一个单独的变量中可以使其工作,但似乎是一种尴尬的解决方法。

k=as.factor(c(rep("a",2), rep("b",2), rep("c",2), rep("d",2), rep("e",2)))
indata=data.frame(k)

outdata<-list()
for (i in 1:10){
  z=i
  tempdata<-ddply(.data = indata, .variables = .(k), .fun = summarize, i=i, z=z)
  data[[i]]<-tempdata
  rm(tempdata)
}
data

对导致这种奇怪行为的原因有什么想法吗?

【问题讨论】:

    标签: r loops plyr


    【解决方案1】:

    这是一个范围界定问题。 ddply 中的函数(我相信llply)使用i 作为局部变量,并且在搜索路径中的i 之前。最简单的解决方法是使用 j 作为迭代器:

    for (j in 1:10)
    

    但是,我不知道您为什么在示例中使用 ddply。这似乎没有必要,所以我认为这只是一个玩具示例。

    【讨论】:

    • 谢谢@Roland!你知道i__ply函数中的作用是什么吗?它是否用于跟踪输入数据被拆分的“片段”?
    • 是的,看起来是这样。在llply 中寻找自己。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多