对于ddply的循环

问题描述 投票:0回答:1

我想在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停止覆盖列表?以及如何在几列上执行相同的循环?

先谢谢你,Luca

r loops for-loop plyr
1个回答
0
投票

这里有一个选项 dplyrpurrr

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

在OP的循环中,'n'是一个单值,即 length 的'x'=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] ))
    }
© www.soinside.com 2019 - 2024. All rights reserved.