我有一个由nrow = 100
和ncol = 5
组成的矩阵,我想打印每一行。
d1 <- rnorm(100, 0, 1)
d2 <- rnorm(100, 0, 1)
d3 <- rnorm(100, 0, 1)
d4 <- rnorm(100, 0, 1)
d5 <- rnorm(100, 0, 1)
x <- cbind(d1, d2, d3, d4, d5)
x
m <- nrow(x)
n <- ncol(x)
y <- matrix(x, m, n)
y
我尝试使用循环打印每一行,但它出现错误:
for(i in 1:100){
f[i] = y[i, ]
}
我的目标是我想从每一行计算hodges lehmann估计量。因为我有100行,意思是说我将有100个估算器。这里我把编码的例子计算为第1行的hodges lehmann估计量。
f=y[1,] #row 1
f
n=length(f)
n
#CALCULATE HL
a1<-NULL
a2<-NULL
a3<-NULL
a4<-NULL
a5<-NULL
for (i in 1:n) {
for (j in 1:n) {
if(i==j){
a1[i]<-(f[i]+f[i])/2
}
else if(i!=j&&j-i==1){
a2[i]<-(f[i]+f[i+1])/2
}
else if(i!=j&&j-i==2){
a3[i]<-(f[i]+f[i+2])/2
}
else if(i!=j&&j-i==3){
a4[i]<-(f[i]+f[i+3])/2
}
else if(i!=j&&j-i==4){
a5[i]<-(d1[i]+d1[i+4])/2
}}}
HL1=median(c(a1,a2,a3,a4,a5))
HL1
这就是为什么我更喜欢使用循环。多谢你们。
这应该能够做到你需要的技巧:
funfun=function(f){s=outer(f,f,"+")/2;median(s[lower.tri(s,T)])}
apply(data,1,funfun)
一些解释:
你的代码取了相距一定距离的元素的平均值:例如,如果你i == j然后只是对角线,我们将自己拥有元素。例如,如果i = j + 1,或j = i + 1,那么它是(f [i] + f [i + 1])/ 2。那是你的代码。等等:
根据你上面提供的功能,如果我的f = 1:5,那么我会得到:
a1 a2 a3 a4 a5
[1,] 1 1.5 2 2.5 3
[2,] 2 2.5 3 3.5 NA
[3,] 3 3.5 4 NA NA
[4,] 4 4.5 NA NA NA
[5,] 5 NA NA NA NA
>
现在我写了一笔钱qazxsw poi。如果我在1:5运行此功能,我得到:
funfun
你看到了什么区别?那么结果只是相同的安排。在你的情况下,i == j是第一列,而在我的情况下,i == j是对角线。在你的情况下,i = j + 1或j = i + 1是第二列,而我的是偏离对角线。如果你想完全像你的那样,我们会做
s=outer(f,f,"+")/2
s
[,1] [,2] [,3] [,4] [,5]
[1,] 1 1.5 2.0 2.5 3.0
[2,] NA 2.0 2.5 3.0 3.5
[3,] NA NA 3.0 3.5 4.0
[4,] NA NA NA 4.0 4.5
[5,] NA NA NA NA 5.0
现在有祸了,就像你的第二列一样。你看到了吗?
好的,现在已经创建了该函数,在行中遍历整个数据:
好吧,我们甚至可以修改funfun,如果你只是了解供应而不是外部:
s[col(s)==row(s)+1]
[1] 1.5 2.5 3.5 4.5
使用问题中提供的“x”,我们可以使用新的“estimatorHL”函数简化这一过程,该函数可以简化索引。
funfun1=function(m){
n=1:length(m)
d=sapply(n,function(x)`length<-`((m[x]+m[x>=n])/2,length(m)))
median(d,na.rm=T)}
apply(data, 1, funfun1)
然后我们将这个函数应用于'x'中的每一行,只有一行:
estimatorHL <- function(rowIn) {
#initialize
a <- NULL
n <- length(rowIn)
k <- 1
for (i in 1:n) {
for (j in i:n) {
a[k] <- (rowIn[i] + rowIn[j])/2
k <- k + 1
}}
HLout <- median(a)
return(HLout)
}
R中的用户定义函数可以真正简化,并且非常强大。