我有一个像这样的数据集:
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
}
答案 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