我有这样的数据集:
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个随机列并将它们添加到dataset中。一个可能的解决办法是:
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
}发布于 2019-06-21 12:34:23
dataframe只是一种特殊的列表,所以您可以把它看作是选择随机列表元素,而不是列。这意味着两个列的随机示例与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开头的列数。
发布于 2019-06-21 11:55:31
我们可以做一个函数
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.0https://stackoverflow.com/questions/56702804
复制相似问题