【问题标题】:How to switch random number of rows' column values in a dataset?如何在数据集中切换随机行数的列值?
【发布时间】:2018-09-24 06:24:31
【问题描述】:

在这里学习 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-loop 或一个函数,我可以在其中随机选择多行(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


    【解决方案1】:

    您可以使用 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]
    }
    

    【讨论】:

    • 我喜欢!谢谢!该死,是的,我很接近
    【解决方案2】:

    您可以通过矢量化方式执行此操作,无需任何类型的循环。 首先,我将重新创建数据集,并删除 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
    

    【讨论】:

    • 哇,太棒了!谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-04
    • 2017-11-11
    • 1970-01-01
    • 2017-02-28
    • 2022-01-20
    • 2015-09-14
    • 1970-01-01
    相关资源
    最近更新 更多