我想在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
这里有一个选项 dplyr
和 purrr
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] ))
}