选择然后替换R

时间:2016-04-14 09:32:49

标签: r matrix random

非常初学者,在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. 中选择一个随机字母
  4. 将1替换为2(随机元素/位置以及来自矢量的随机字母。)
  5. 任何帮助都会受到赞赏,虽然它看起来相对毫无意义,但它是我在夏天必须做的一些编程的核心概念而且我真的非常希望能够做到并理解正在发生的事情确保我能够实际完成我承诺的项目。

    另外,我还没有调查过这部分的循环部分,因此任何指导都会很棒。

    非常感谢

2 个答案:

答案 0 :(得分:1)

首先:你想要一个character矩阵,所以不要使用factor。只需定义:

bob.a<-letters[1:5]

或将其转换为bob.a<-as.character(bob.a)(如果已存在)。 bob.matrix在创建时没问题。只是不要使用byrow=TRUE:这是它的目的,因为元素是随机的?如果您想要替换bob.matrix的随机元素,请尝试:

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

答案 1 :(得分:0)

好的,这是一个简单且有希望解释清楚的代码:

    var userData = new UserData(sqlDataReader["Employee_ID"].ToString(),
                        sqlDataReader["Name"].ToString(),
                        sqlDataReader["ContactInfo"].ToString(),
                        sqlDataReader["JoinDateTime"].ToString(),
                        bool.Parse(sqlDataReader["Active"].ToString()),
                        sqlDataReader["Username"].ToString(),
                        sqlDataReader["Password"].ToString());
  switch (sqlDataReader["TypeName"].ToString())
    {
                case "Manager": yield return new Manager(userData);
                case "Cashier": yield return new Cashier(userData);

    }

产生

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