簡體   English   中英

它如何使用 R 中的函數迭代矩陣?

[英]How it iterate over a matrix using a function in R?

我創建了一個函數來訂購長度為 2 的向量,使用以下代碼

x = (c(6,2))
orders = function(x){
  for(i in 1:(length(x)-1)){
  if(x[i+1] < x[i]){
    return(c(x[i+1], x[i]))} else{
      (return(x))
  }}}


orders(x)

我被要求使用此函數來處理具有 2 列的數據集,如下所示。 迭代數據集的行,如果第i行第 2 列中的元素小於第i行第一列中的元素,則通過適當調用你剛剛寫的函數。

我試過使用以下代碼

set.seed(1128719)
data=matrix(rnorm(20),byrow=T,ncol=2)
df = for (i in 1:2) {
  for(j in 1:10){
    data = orders(c(x[i], x[j]))
    return(data)
  }

}

輸出為空。 我不太確定我哪里出錯了。 有什么建議?

我稍微修改了您的代碼,但試圖保持“樣式”相同 不需要循環i in 1:(length(x)-1)總是計算為for i in 1:1i只會取值 1。

orders = function(x){

      # Since the function will only work on vectors of length 2
      # its good practice to raise an error right at the start
      #   
      if (length(x) != 2) {
        stop("x must be vector of lenght 2")
      } 

  if (x[2] < x[1]) {
    return(c(x[2], x[1]))
  } else {
    return(x)
  }
}

orders(c(6, 2))


set.seed(1128719)
data <- matrix(rnorm(20),byrow=T,ncol=2)

for 循環本身不能分配給變量但我們使用循環來改變矩陣“數據”

for (row in 1:nrow(data)) {
  data[row, ] <- orders(data[row,])
}

data

編輯:

這是輸入:

            [,1]        [,2]
[1,] -0.04142965  0.2377140
[2,] -0.76237866 -0.8004284
[3,]  0.18700893 -0.6800310
[4,]  0.76499646  0.4430643
[5,]  0.09193440 -0.2592316
[6,]  1.17478053 -0.4044760
[7,] -1.62262500  0.1652850
[8,] -1.54848857  0.7475451
[9,] -0.05907252 -0.8324074
[10,] -1.11064318 -0.1148806

這是我得到的輸出:

            [,1]        [,2]
[1,] -0.04142965  0.23771403
[2,] -0.80042842 -0.76237866
[3,] -0.68003104  0.18700893
[4,]  0.44306433  0.76499646
[5,] -0.25923164  0.09193440
[6,] -0.40447603  1.17478053
[7,] -1.62262500  0.16528496
[8,] -1.54848857  0.74754509
[9,] -0.83240742 -0.05907252
[10,] -1.11064318 -0.11488062

以下是對 2 列矩陣進行排序的兩種方法。

這是問題中發布的測試矩陣。

set.seed(1128719)
data <- matrix(rnorm(20), byrow = TRUE, ncol = 2)

1.帶有orders功能。

該函數需要一個 2 元素向量作為輸入。 如果它們亂序,則返回其元素顛倒的向量,否則按原樣返回向量。

orders <- function(x){
  stopifnot(length(x) == 2)
  if(x[2] < x[1]){
    x[2:1]
  }else{
    x
  }
}

測試功能。

x <- c(6,2)
orders(x)
#[1] 2 6

現在有了矩陣data

df1 <- t(apply(data, 1, orders))

2.矢量化代碼。

每當元素無序時創建一個帶有TRUE的邏輯索引,並且只反轉這些元素。

df2 <- data
inx <- data[,2] < data[,1]
df2[inx, ] <- data[inx, 2:1]

結果是一樣的。

identical(df1, df2)
#[1] TRUE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM