[英]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:1
, i
只會取值 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)
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))
每當元素無序時創建一個帶有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.