簡體   English   中英

選擇並替換R中矩陣的元素

[英]Selecting and then replacing an element of a matrix in R

極其初學者,在R中隨機執行操作的整個概念是我尚未掌握的。

下面的代碼是我嘗試創建一個矩陣的起點,該矩陣由字母a-e(帶有替換等)的隨機分布組成,這是我的向量“ bob.a”。 然后,我需要從此矩陣中選擇一個隨機元素,然后用另一個“ bob.a”樣本替換它(因此,另一個隨機字母,即使該字母以相同的結尾)也是如此。 理想情況下,我將通過大約100次循環運行此操作,直到隨機替換了每個元素(盡管在確保隨機替換元素100次的宏偉方案中,替換每個元素並不重要)。

我的代碼是:

##Create Bob Vector
bob.a<-factor(c(letters[1:5]))
##Check Bob Vector
bob.a


#Matrix creation (Random)
bob.matrix<- matrix(sample(bob.a,25,replace=TRUE),
                      nrow=5,
                      ncol=5,
                      byrow = TRUE)
##Check bobmatrix.v2
bob.matrix


##Random removal (&replace?)
bob.matrix[2,3] <- sample(bob.a,1,replace=TRUE)

sample(bob.matrix,1)

bob.matrix[,] <- sample(bob.a,1,replace=TRUE)

sample(bob.matrix,1) <- sample(bob.a,1,replace=TRUE)

(我正在做所有非常基本的事情,並檢查了每一步,因為我非常需要了解我正在做的事情的核心概念!)

雖然我確定答案將涉及樣本甚至索引,但是隨機地這樣做現在對我來說已經完全消失了。

我只是嘗試做一個簡單的替換,只是為了檢查我是否知道,但是那甚至沒有用,因為生產線

bobmatrix.v2[2,3] <- sample(bob.a,1,replace=TRUE)

為文本插入一個數字值(例如,將位置[2,3]替換為1而不是a),這完全讓我失望了。 最后兩行代碼是我嘗試不同的事情,這些事情都不符合我的想法。

在隨機替換中,我認為它可以使用索引編制或抽樣,但是我對索引編制的知識很低。 而且,我在網上看到的內容似乎通常基於替換某些元素(例如用其他東西替換所有“ a”)或對其進行某種變體,而不是在矩陣中選擇單個隨機元素。采樣方式相同(但能夠替換該元素)。

最終,我需要3件事(我認為很簡單):

  1. 在矩陣中選擇一個隨機元素/位置
  2. 從向量“ sample(bob.a,1)中選擇一個隨機字母
  3. 用2替換1(隨機元素/位置帶有來自矢量的隨機字母。)

任何幫助將不勝感激,盡管它似乎相對毫無意義,但它是某些編程的核心概念,我將不得不在整個夏天進行,而我確實非常希望能夠做並了解正在發生的事情,以確保實際上,我可以執行我承諾的項目。

另外,我還沒有研究循環部分,因此任何指導都將是很棒的。

非常感謝

首先:您需要一個character矩陣,所以不要使用factor s。 只需定義:

bob.a<-letters[1:5]

或通過bob.a<-as.character(bob.a)對其進行轉換bob.a<-as.character(bob.a)如果已存在)。 bob.matrix創建bob.matrix可以了。 只是不要使用byrow=TRUE :這是它的目的,因為該元素是隨機的? 如果要替換bob.matrix的隨機元素, bob.matrix嘗試:

bob.matrix[sample(length(bob.matrix),1)]<-sample(bob.a,1)

好的,這是一個簡單的希望是不言自明的代碼:

sample.letters <- factor(c(letters[1:5]))
sample.matrix <- matrix(sample(sample.letters,25,replace=TRUE), nrow=5, ncol=5, byrow = TRUE)

random.row <- sample(1:nrow(sample.matrix),1)
random.col <- sample(1:ncol(sample.matrix),1)

sample.matrix.2 <- sample.matrix
sample.matrix.2[random.row, random.col] <- as.character(sample(sample.letters,1))

#before
sample.matrix
# what's changed?
paste("changed: ",random.row,",",random.col)
#after
sample.matrix.2

產生

> #before
> sample.matrix
     [,1] [,2] [,3] [,4] [,5]
[1,] "c"  "d"  "b"  "b"  "e" 
[2,] "a"  "b"  "d"  "a"  "b" 
[3,] "c"  "d"  "d"  "a"  "c" 
[4,] "c"  "d"  "e"  "d"  "b" 
[5,] "a"  "d"  "d"  "a"  "c" 
> # what's changed?
> paste("changed: ",random.row,",",random.col)
[1] "changed:  1 , 3"
> #after
> sample.matrix.2
     [,1] [,2] [,3] [,4] [,5]
[1,] "c"  "d"  "a"  "b"  "e" 
[2,] "a"  "b"  "d"  "a"  "b" 
[3,] "c"  "d"  "d"  "a"  "c" 
[4,] "c"  "d"  "e"  "d"  "b" 
[5,] "a"  "d"  "d"  "a"  "c" 

分配的問題是您正在使用factor ,因此請執行以下操作:

sample(sample.letters,1)

int返回因子,因此,如果您只想將因子作為character (即字母),則需要強制將其強制:

as.character(sample(sample.letters,1))

暫無
暫無

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

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