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

时间:2018-04-13 20:29:08

标签: r function for-loop random

在这里学习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]
  }
}

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

谢谢!

2 个答案:

答案 0 :(得分:0)

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

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]
}

答案 1 :(得分: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