在R data.table中随机选取50列却仅得50行,如何解决?
解决data.table随机选取列的问题
问题根源
sample_n()是dplyr包中专门用于随机抽取行的函数,它根本没有axis参数——你添加的这个参数会被直接忽略,所以代码实际执行的是随机抽取50行,这就是结果只有50行的原因。
正确解决方案
方法1:data.table原生语法(推荐,效率更高)
利用data.table的列索引特性,先随机生成要保留的列的索引或列名,再完成筛选:
# 方式1:通过列索引随机选50列 rand_col_indices <- sample(ncol(ogTable), 50) randomTable <- ogTable[, ..rand_col_indices] # 方式2:通过列名随机选50列 rand_col_names <- sample(colnames(ogTable), 50) randomTable <- ogTable[, rand_col_names, with = FALSE]
- 解释:
..是data.table的语法,用于引用全局环境中的列索引向量;with = FALSE用于告诉data.table直接将字符向量作为列名处理(新版本data.table可省略,但保留更兼容)。
方法2:结合dplyr语法(若习惯tidyverse风格)
用select()函数搭配sample()来随机选择列:
library(dplyr) # 通过列数随机选50列 randomTable <- ogTable %>% select(sample(ncol(.), 50)) # 或者通过列名随机选50列 randomTable <- ogTable %>% select(sample(colnames(.), 50))
注意事项
如果原数据表存在重复列名,若想避免重复抽取同一列,确保sample()的replace参数为FALSE(这是sample()的默认设置,无需额外修改)。
内容的提问来源于stack exchange,提问作者Feynman
相关产品推荐
相关产品推荐

