在ddply上循环

时间:2020-05-11 18:15:16

标签: r loops for-loop plyr

我试图在R中使用for进行循环。我想做的事情很简单。我有一个向量(但是我也在尝试在数据框中的列),并且在dpply中有一个函数,其中R必须替换向量中的值:

x = c(1,3,4)

我的数据框prova1是:

   anno variable value
1   1922      gen   0.5
2   1922      gen   0.0
3   1922      gen   1.5
4   1922      gen   0.0
5   1922      gen   4.0
6   1922      gen   2.5
7   1922      gen   5.0
8   1922      gen   0.0
9   1922      gen   0.0
10  1922      gen   0.0
11  1922      gen   0.0
12  1922      gen   0.0
13  1922      gen   0.0
14  1922      gen   0.0
15  1922      gen   0.0
16  1922      gen   2.5
17  1922      gen   0.0
18  1922      gen   0.0

另外,我希望r将函数的每个结果存储在一个列表中,因此我创建了一个空的列表对象

usq<-list()

然后我使用循环

  n = length(x)
   for(i in n) {
  usq[[i]] <-ddply(prova1, .(anno),  summarize,
                             sum = sum(value >= x[i] ))
}

问题在于,R每次都会覆盖整个列表,因此最终我得到的列表的第一个值为NULL,只有列表的最后一个对象正确。

此外,我想对像这样的列或行执行相同的循环:

   gen   feb   mar   apr   mag   giu   lug   ago   set   ott   nov   dic
  3.93   5.2   3.2     4     5     6     7     8     9    10    11    12

,以便在列表中为每一列获取一个对象。 有什么办法阻止R覆盖列表? 以及如何在几列上执行相同的循环?

先谢谢您, 路卡

1 个答案:

答案 0 :(得分:0)

这里是dplyrpurrr的一个选项

library(dplyr)
library(purrr)
map(x, ~ prova1 %>%
            group_by(anno) %>%
            summarise(Sum = sum(value >= .x)))

在OP的循环中,“ n”是单个值,即“ x”的length =3。我们正在循环

for(i in 3) # i.e. one time

应该是

for(i in 1:3)

for(i in seq_len(n))

最好以预定义的长度初始化输出list

library(plyr)
usq <- vector('list', length(x))
for(i in seq_len(n)) {
    usq[[i]] <- ddply(prova1, .(anno),  summarize,
                         sum = sum(value >= x[i] ))
    }
相关问题