R:将行提取为新矩阵

时间:2017-12-25 19:17:35

标签: r matrix

我有一个由IWebElement elm = driver.FindElement(By.XPath("/html/body/div[2]/div[2]/table[1]/tbody/tr[2]")); 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

我的目标是我想从每一行计算hodges lehmann估算器。因为我有100行,意思是说我将有100个估算器。这里我把编码的例子计算为第1行的hodges lehmann估计量。

for(i in 1:100){
    f[i] = y[i, ]
}

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

2 个答案:

答案 0 :(得分: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。那是你的代码。 ETC:

根据你上面提供的功能,如果我的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
> 

现在我写了一笔钱funfun。如果我在1:5运行此功能,我得到:

 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

你看到了什么区别?那么结果只是相同的安排。在你的情况下,i == j是第一列,而在我的情况下,i == j是对角线。在你的情况下,i = j + 1或j = i + 1是第二列,而我的是偏离对角线。如果你想完全像你的那样,我们会做

s[col(s)==row(s)+1]
[1] 1.5 2.5 3.5 4.5

现在这与第二列完全相同。你看到了吗?。

好了,现在已经创建了该函数,按行遍历整个数据:

我们甚至可以修改funfun,如果你只是了解供应而不是外部:

 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)

答案 1 :(得分:0)

使用问题中提供的'x',我们可以使用新的'estimatorHL'函数来简化这一过程,该函数可以简化索引。

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)
 }

然后我们将这个函数应用于'x'中的每一行,只有一行:

HL_estimateAll <- apply(x, 1, estimatorHL)

R中的用户定义函数可以真正简化,并且非常强大。