我有一个像这样的数据集:
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
列val2
和val1
被随机选择并添加到数据集中。我面临的问题是如何选择随机列。我知道如何通过使用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
}
数据框只是一种特殊的列表,因此您可以将其视为选择随机列表元素而不是列。这就是说,随机抽取两列样本就很简单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
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句