如何基于更快地取得平均值来制作功能

时间:2016-12-17 13:42:11

标签: r

我有数据

    df <- structure(list(A = c(482590, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 484830, 
0, 0, 0, 0, 0, 0, 0, 1127300), B = c(265440, 0, 0, 305820, 0, 
0, 0, 0, 0, 279470, 0, 394370, 0, 0, 0, 0, 0, 0, 0, 902040), 
    C = c(368610L, 0L, 0L, 366220L, 0L, 0L, 0L, 0L, 0L, 507830L, 
    0L, 616740L, 0L, 0L, 0L, 0L, 0L, 0L, 0L, 799360L), D = c(1088200, 
    0, 0, 720090, 0, 0, 0, 0, 0, 272930, 0, 1136300, 0, 0, 0, 
    0, 0, 0, 0, 805500), E = c(863720L, 0L, 0L, 545860L, 0L, 
    0L, 0L, 0L, 0L, 381660L, 0L, 1952700L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 639660L), F = c(715590L, 0L, 0L, 1060200L, 0L, 0L, 
    0L, 120540L, 0L, 977980L, 0L, 2018900L, 0L, 0L, 0L, 0L, 0L, 
    0L, 0L, 630630L)), .Names = c("A", "B", "C", "D", "E", "F"
), row.names = c(NA, 20L), class = "data.frame")

我正在尝试获得这样的输出

df2<- structure(c(374015, 0, 372213.333333333, 0, 317025, 0), .Dim = 2:3, .Dimnames = list(
    c("1", "2"), NULL))

我可以通过以下代码来完成,但我想知道是否有更快的方法和更清洁的方法来做到这一点?

func <- function(x) { x=as.numeric(x)
  y = mean(mean(x, na.rm=T), x[2], na.rm=T)
  return(y)
}

df2 <- t(rollapply(t(cbind(NA,df,NA)),width=3,FUN=func,by.column=T))

1 个答案:

答案 0 :(得分:0)

关于这个问题,

  • mean(x, y)不是xy的意思。它表示x的平均值trim值为y。见?mean`

  • 问题中的
  • df2是一个矩阵,而不是data.frame,与其名称所隐含的内容相反。

  • 输入数据中没有NA。唯一的NAs是您使用cbind(NA, x, NA)构造自己添加的NAs。因此,我们可以通过不使用该构造来避免考虑NA,这也允许我们避免定义func

试试这段代码:

library(zoo)

tm_in <- t(df)
m_out <- t((rollapply(tm_in, 3, mean, partial = TRUE) + tm_in)/2)

如果您愿意允许两个端点为NA或之后修复它们,那么这将更快:

m_out <- t((rollmean(tm_in, 3, fill = NA) + tm_in)/2)

此外,如果您将输入和输出从一开始存储为转置矩阵,则可以保存数据帧的转置和转换。

你可以尝试的另一件事是RcppRoll中的roll_sum使用C ++并且可能更快。