【问题标题】:R: Sample n elements in certain columns in a dataframe/matrix and replace their valuesR:在数据框/矩阵的某些列中采样 n 个元素并替换它们的值
【发布时间】:2021-03-10 11:01:20
【问题描述】:

我正在努力解决标题中的问题。

我的数据框是这样的:

  X1 X2 X3 X4 X5

1 1  2  3  4  5

2 6  7  8  9 10

3 11 12 13 14 15 

我正在尝试做的是从第三列和第四列中随机选择 3 个元素并将它们的值替换为 0。所以操纵的数据框可能像

 X1 X2 X3 X4 X5

1 1  2  3  4  5

2 6  7  0  0 10

3 11 12 13 0 15 

我从这里Random number selection from a data-frame看到如果我将数据框转换为矩阵会更容易,所以我尝试了

mat <- data.frame(rbind(rep(1:5, 1), rep(6:10, 1), rep(11:15, 1)))
mat_matrix <- as.matrix(mat)
mat_matrix[sample(mat_matrix[, 3:4], 3)] <- 0 

但它只是在矩阵的所有列和行中随机选取 3 个元素并将它们变成 0。

谁能帮帮我?

【问题讨论】:

    标签: r dataframe matrix sample


    【解决方案1】:

    您可以从中使用slice.indexsample

    mat_matrix[sample(slice.index(mat_matrix, 1:2)[,3:4], 3)] <- 0
    

    【讨论】:

    • 从你那里学到了新的操作slice.index!点赞!
    【解决方案2】:

    在这种情况下,for 循环没有错。可能是这样的:

    
    mat <- data.frame(rbind(rep(1:5, 1), rep(6:10, 1), rep(11:15, 1)))
    cols <- c(3,4)
    
    n <- nrow(mat)*length(cols)
    v <- sample( x=1:n, size=3 )
    m <- matrix(FALSE, ncol=length(cols), nrow=nrow(mat))
    m[v] <- TRUE
    
    for( i in seq_along(cols) ) {
        mat[ m[,i], cols[i] ] <- 0
    }
    

    只需创建一个两列“索引矩阵”,您可以对其进行采样并用于替换回您的数据。

    【讨论】:

    • 谢谢@Sirius!但是我想从第 3 列和第 4 列中总共选择 3 个元素,而不是每列中的 3 个元素(所以它应该从 8 个元素中随机抽样)。有没有办法做到这一点?
    • 当然有!但您肯定是指来自 6 个元素的样本,因为 3 行和 2 列总共有 6 个?
    • 是的,抱歉,这是个错误:我的意思是绝对是 6
    • 也不要轻易被 tidyverse 和 data.table 的整洁所蒙蔽。清楚地表明意图的简单易读的代码也具有价值。无需使简单的任务过于复杂。
    • 效果很好!非常感谢:D 是的,避免过于复杂的事情绝对是正确的
    【解决方案3】:

    这是使用replace的一种方式

    cols <- c("X3", "X4")
    N <- 3
    df[cols] <- replace(as.matrix(df[cols]), sample(length(unlist(df[cols])), N), 0)
    

    这样

    > df
      X1 X2 X3 X4 X5
    1  1  2  3  0  5
    2  6  7  8  0 10
    3 11 12  0 14 15
    

    【讨论】:

    • 谢谢!我想知道是否可以稍微修改您的代码以仅对非零元素进行采样但失败了...我尝试了 df[cols]
    猜你喜欢
    • 2021-11-02
    • 2013-03-14
    • 1970-01-01
    • 2013-09-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多