如何在数据集中切换随机行数的列值?

问题描述 投票:1回答:2

在这里学习R代码。这是我的数据集,然后我会详细解释我想要完成的事情:

alp <- c("a", "b", "c","d", "e", "f")
num <- c(1:6)
my.set <- data.frame(num, alp)

它看起来像这样:

num alp  
1   a  
2   b  
3   c  
4   d  
5   e  
6   f  

具有6行和2列的数据集。 (对不起,我花了很多时间写完这一切,我无法弄清楚如何在数据集中包含空格以便在屏幕上显示得很好)

我需要创建一个for循环或一个函数,我可以随机选择多行(0到6行之间)并切换它们各自的列值。换句话说,选择我们剥离标签的随机行数,并使用num值翻转alp值。

为了让它看起来像这样(假设选择了2行进行更改):

num alp  
a  1  
2  b  
3  c  
d  4  
5  e  
6  f  

我是这样做的:对于每一行,我想要翻转一枚硬币。如果它是头(或0),则切换其列值。如果它是尾巴(或1),它没有任何反应。

到目前为止我已经有了这个,但是它会抛出错误消息:

for (j in 1:nrow(my.set)) {
  flip <- sample(0:1, 1, replace = TRUE)
  if (flip==0) {
      my.set[j,1:2] <- my.set[j,2:1]
  } else {
      my.set[j,1:2] <- my.set[j,1:2]
  }
}

那么我做错了什么,我该如何解决这个问题呢?任何帮助表示赞赏!

谢谢!

r function for-loop random
2个回答
0
投票

您可以以矢量化方式执行此操作,不需要任何类型的循环。首先,我将重新创建数据集,并删除类factor的列。 然后代码创建一个索引flip并更改相应的行。

my.set <- data.frame(num, alp, stringsAsFactors = FALSE)

set.seed(1943)    # Make the results reproducible

flip <- which(sample(0:1, nrow(my.set), replace = TRUE) == 1)
my.set[flip, 1:2] <- my.set[flip, 2:1]

my.set
#  num alp
#1   a   1
#2   b   2
#3   3   c
#4   4   d
#5   5   e
#6   f   6

0
投票

您可以使用apply和sample来完成此任务。 apply比r中的for循环要好。你告诉它要经过什么数据帧(my.set),然后遍历行(1表示行,2表示列)然后给它你想要的功能。在这种情况下,我们希望它以随机顺序放置列号,这就是“sample(length(x))”的作用。

my.set <- apply(my.set, 1, function(x) x[sample(length(x))])

或者,如果您真的宁愿使用for循环,那么您就近了。

my.set <- data.frame(num, alp, stringsAsFactors=F)
for (j in 1:nrow(my.set)) {
  flip <- sample(1:2)
  my.set[j,1:2] <- my.set[j,flip]
}
© www.soinside.com 2019 - 2024. All rights reserved.