我有数据
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))
答案 0 :(得分:0)
关于这个问题,
mean(x, y)
不是x
和y
的意思。它表示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 ++并且可能更快。