【问题标题】:R loop dataframes [duplicate]R循环数据帧[重复]
【发布时间】:2013-05-05 22:32:16
【问题描述】:

我正在处理 R 中只有 2 列但行数非常多的数据框。我想将我的数据框划分为每个“m”行的子集,并为数据框的每个分区找到这些 m 行中每一行的列中值的平均值,然后为包含“m”的所有分区返回这些平均值' 每行。

假设我的数据框是 y,列 'a' 和 'b' 并且在这种情况下我希望 'm' 为 1000。

我想求均值(y[i:i+999,2])

我想在所有行中取 i 的值并返回平均值,在这种情况下,每个块的 1000 个值在列“b”中

i=1
add=function(i,999){i=i+999}
z=return(i)
p=mean(y[z,2])

我认为我做错了。有什么见解吗?

【问题讨论】:

    标签: r dataframe mean


    【解决方案1】:

    如果我正确理解您的问题,您需要在您的列上使用移动平均线 b

    y<-data.frame(a=runif(2000),b=runif(2000))
    
    m=1000
    means=NULL;p=NULL
    for(i in 1:(nrow(y)-m)){
      p=c(p,mean(y[i:(i+999),2]))
    }
    
    plot(p)
    

    【讨论】:

    • 如果他们想要移动平均线,他们应该使用filter。如果你想为此使用循环,至少预先分配p
    • p&lt;-NULL 工作正常,我不确定 OP 是否想要 MA 或只是 1k 大小块的平均值。此外,filter() 位于 stats 包中,因此为此加载一个包...
    • 您在Second Circle of Hell 中。默认情况下会加载包统计信息。
    • for(i in 1:(nrow(y)-m)){p=c(p,mean(y[i:(i+999),2]))} @Romain This代码给出错误:在 mean.default(y[i:(i + 999), 2]) 中:参数不是数字或逻辑:返回 NA
    • 对不起,我明白了。我的代码中还有其他错误:) 非常感谢
    【解决方案2】:

    zoo 包有rollapply,这对于应用这样的滚动函数非常有用。您可以使用sapply 循环遍历data.frame 的列并应用rollapply 函数(sapply 循环遍历列表的元素,数据框实际上是列表的集合)。

    希望这个例子有意义...

    require(zoo)
    ## Sample data, two columns one million rows
    df <- data.frame( A = runif(1e6) , B = runif(1e6) )
    
    ## Set desried 'chunk' size, i.e. the
    ## number of rows to find the mean of
    ## at once. Let's do 1e4, so we will 
    ## get 100 values back (1e6/1e4=1e2)
    m = 1e4
    
    ## use sapply to loop across the columns, and
    ## apply rollapply to each column, which takes
    ## the mean of each set of 10,000 values
    dfMean <- sapply( df , function(x) rollapply( x , width = m , by = m , align = "left" , FUN = mean ) )
    
    nrow(dfMean)
    #[1] 100
    
    head(dfMean)
    #            A         B
    #[1,] 0.4966775 0.4992207
    #[2,] 0.5013934 0.4986489
    #[3,] 0.4994544 0.5009876
    #[4,] 0.5020374 0.4979467
    #[5,] 0.5049408 0.4999280
    #[6,] 0.4969987 0.5018564
    

    【讨论】:

    • 我在上传 zoo 包时实际上遇到了错误。不知道为什么。
    • 错误是什么?你安装了吗?试试install.packages( "zoo" ) ; require(zoo)
    • 我使用的是旧版本的 R. zoo 需要 3.0.0 。整理出来:)
    【解决方案3】:

    使用data.table 将是您最快的选择,我认为“分组依据”的by= 语法非常直观。

    library(data.table)
    
    # Sample data:
    dt<-data.table(A=runif(1e6L), B=runif(1e6L), key="B")
    
    # Note that keying by column B will order the rows by B;
    # You can leave out the key if you don't care about the order
    # or have already set it
    
    # Average every 1000 records in column B:
    dt[,list(avg=mean(B)),by=rep(1L:nrow(dt),each=1000L,length.out=nrow(dt))]
    

    这需要大约十分之一秒,而 rollaply 解决方案需要超过 48 秒。

    【讨论】:

      猜你喜欢
      • 2017-06-12
      • 2020-06-09
      • 2013-07-12
      • 2019-11-12
      • 2019-07-29
      • 1970-01-01
      • 1970-01-01
      • 2019-08-08
      • 1970-01-01
      相关资源
      最近更新 更多