我有一个与此类似的矩阵:
1 2 3 4 5
a 1.4 NA 2.3 0.2 NA
b NA 3.2 1.2 NA NA
c 3.5 NA NA NA NA
d 2.1 1.9 NA NA NA
我需要在矩阵中插入NA。当我指定哪一行时,我能够做到:
fmm = spline(x = 1:5, y = RatioNA[1,1:5], xout = 1:5, method = "fmm")
但是我不能同时为整个桌子做这件事。
另外,它不是为每一行执行,而是为每一列执行此操作。也就是说,它不使用(1.4,NA,2.3,0.2,NA)进行插值,而是使用(1.4,NA,3.5,2.1)。我需要前者。
如何在不指定哪一行的情况下每行而不是列来获取样条线?
谢谢。
答案 0 :(得分:0)
您可以使用na.spline
的{{1}}个zoo
包在场景后使用splinefun
。它可以为矩阵进行插值,或者更精确地为具有coredate
矩阵的多变量时间序列进行插值。
但是,您应首先创建带有一些虚拟日期的多变量时间序列。
library(zoo)
mm <- read.table(text=' 1 2 3 4 5
a 1.4 NA 2.3 0.2 NA
b NA 3.2 1.2 NA NA
c 3.5 NA NA NA NA
d 2.1 1.9 NA NA NA',header=TRUE)
## na.spline interpolate by column so you should transpose
d0 <- as.Date("2000-01-01")
vv = na.spline(zoo(t(mm),d0+seq_len(ncol(mm))), na.rm = FALSE)
## you transpose again to get you matrix
t(coredata(vv))
# X1 X2 X3 X4 X5
# a 1.4 2.7 2.3 0.2 -3.6
# b 5.2 3.2 1.2 -0.8 -2.8
# c 3.5 3.5 3.5 3.5 3.5
# d 2.1 1.9 1.7 1.5 1.3
答案 1 :(得分:0)
您可以使用apply函数为矩阵的每一行或每列执行指定的函数
样本数据
*txt=" 1 2 3 4 5
a 1.4 NA 2.3 0.2 NA
b NA 3.2 1.2 NA NA
c 3.5 NA NA NA NA
d 2.1 1.9 NA NA NA"
df=read.table(text=txt,header=T)*
样本计算
fmm = spline(x = 1:5, y = df[1,1:5], xout = 1:5, method = "fmm")
计算每一行的功能
myFun<-function(yrow){
fmm = spline(x = 1:5, y = yrow, xout = 1:5, method = "fmm")
return(fmm$y)
}
评估矩阵的每一行。注意,需要转置,因为“apply”的输出是列向量。
df_interp <- t(apply(df, 1, myFun))
产生的输出
df_interp
[,1] [,2] [,3] [,4] [,5]
a 1.4 2.7 2.3 0.2 -3.6
b 5.2 3.2 1.2 -0.8 -2.8
c 3.5 3.5 3.5 3.5 3.5
d 2.1 1.9 1.7 1.5 1.3