如何从数据集中选择随机列

时间:2019-06-21 11:44:53

标签: r

我有一个像这样的数据集:

ID  val1    val2    val3    val4
1   4       9       10      16
2   1.5     6       2.3     99
3   8       7       7       10

我想检查列数(即val列)是否少于6,如果是这种情况,我想从现有列中随机选择剩余的列数并添加他们再次到数据集。

在上述情况下,剩余的列数为2(val的6至4列)。在这种情况下,我想从val列中选择2个随机列,并将它们添加到数据集中。一种可能的解决方案是:

ID  val1    val2    val3    val4   val2   val1
1   4       9       10      16     9      4
2   1.5     6       2.3     99     6      1.5
3   8       7       7       10     7      8

val2val1被随机选择并添加到数据集中。 我面临的问题是如何选择随机列。我知道如何使用sample_n函数选择随机行,但是找不到任何函数来选择随机列。

到目前为止,我所做的是:

t <- read.csv("path", header=TRUE) # load file
numCols <- 6
cc <- ncol(t[,-1]) #no need for ID column
if(cc < numCols){
   # I need some function to select random columns 
}

2 个答案:

答案 0 :(得分:2)

数据框只是一种特殊的列表,因此您可以将其视为选择随机的 list元素,而不是列。这意味着两列的随机样本就像sample(df, 2)一样简单。对于您而言,假设cbind是第一列,您可以df[-1]ID中抽取一个样本来保持简洁:

nc <- 6 + 1 # val columns plus ID column

if(ncol(df) < nc){
    cbind(df, sample(df[-1], nc - ncol(df)))
}

#### OUTPUT ####

  ID val1 val2 val3 val4 val3 val2
1  1  4.0    9 10.0   16 10.0    9
2  2  1.5    6  2.3   99  2.3    6
3  3  8.0    7  7.0   10  7.0    7

如果您不知道ID在哪里,可以使用df[-grep("ID", names(df))]之类的东西代替df[-1]。如果存在既不是ID也不是以val开头的其他列,则应使用df[grep("^val", names(df))]。在后一种情况下,您还需要对nc进行调整,即,您不仅需要添加1,还需要添加不以val开头的列数。

答案 1 :(得分:1)

我们可以做一个函数

add_columns <- function(df, n) {
   cols <- grep("val", names(df), value = TRUE)
   if (length(cols) < n)
     return(cbind(df, df[sample(cols, n - length(cols))]))
   return(df)
}

add_columns(df, 6)
#  ID val1 val2 val3 val4 val2 val1
#1  1  4.0    9 10.0   16    9  4.0
#2  2  1.5    6  2.3   99    6  1.5
#3  3  8.0    7  7.0   10    7  8.0

add_columns(df, 5)
#  ID val1 val2 val3 val4 val3
#1  1  4.0    9 10.0   16 10.0
#2  2  1.5    6  2.3   99  2.3
#3  3  8.0    7  7.0   10  7.0