首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从数据集中选择随机列

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

Stack Overflow用户
提问于 2019-06-21 11:44:53
回答 2查看 2.7K关注 0票数 2

我有这样的数据集:

代码语言:javascript
复制
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中。一个可能的解决办法是:

代码语言:javascript
复制
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函数来选择随机行,但是我找不到任何函数来选择随机列。

到目前为止我所做的是:

代码语言:javascript
复制
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 
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-21 12:34:23

dataframe只是一种特殊的列表,所以您可以把它看作是选择随机列表元素,而不是列。这意味着两个列的随机示例与sample(df, 2)一样简单。在您的示例中,您可以通过cbinddf[-1]获取一个示例来保持简洁,假设ID是第一列:

代码语言:javascript
复制
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开头的列数。

票数 2
EN

Stack Overflow用户

发布于 2019-06-21 11:55:31

我们可以做一个函数

代码语言:javascript
复制
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
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56702804

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档