繁体   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