循环内的plyr:意外行为

时间:2014-08-13 10:55:51

标签: r loops plyr

在循环中使用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

关于导致这种奇怪行为的任何想法?

1 个答案:

答案 0 :(得分:0)

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

for (j in 1:10)

但是,我不知道你为什么在你的例子中使用ddply。它似乎没必要,所以我认为它只是一个玩具的例子。