R:将行提取为新矩阵

问题描述 投票:0回答:2

我有一个由nrow = 100ncol = 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

这就是为什么我更喜欢使用循环。多谢你们。

r matrix
2个回答
0
投票

这应该能够做到你需要的技巧:

  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

0
投票

使用问题中提供的“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中的用户定义函数可以真正简化,并且非常强大。

© www.soinside.com 2019 - 2024. All rights reserved.