如何从r中的单个数据帧中分割出具有随机子集的数据帧?

时间:2019-05-23 01:51:09

标签: r

我在r中有一个数据行,其中有1000行,我想将其拆分为10个数据帧,每个数据帧中有100行,采样替换为False,这样我就得到了全部1000行,如何循环执行并存储所有10行数据帧作为列表还是基于索引的一种有效使用方式?

data <- read.csv("data.csv")
nrow(data)
1000

我分裂为

split1 <- sample_n(100, replace = FALSE)

类似地,我需要用1000个行进行10个拆分,sample_n给我随机100行,我想确保第二个拆分不占用split1中的任何行,然后我可以将其存储为列表或任何形式基于索引的有效使用方式

l = list(split1, split2,....)

无需存储在磁盘中,只需存储中间的R数据,如果为了使代码简单而在循环中发生会更好

2 个答案:

答案 0 :(得分:1)

您可以使用sample对行和split进行随机组合,然后创建一个要使用gl进行拆分的组

split(data[sample(seq_len(nrow(data))), ], gl(nrow(data)/100, 100))

这将为您提供10个数据帧的列表,每个数据帧将有100行,没有重复的行。


mtcars上使用它来创建4组,每组8行

split(mtcars[sample(seq_len(nrow(mtcars))), ], gl(nrow(mtcars)/8, 8))

#$`1`
#                  mpg cyl disp  hp drat   wt qsec vs am gear carb
#AMC Javelin      15.2   8  304 150 3.15 3.44 17.3  0  0    3    2
#Merc 450SLC      15.2   8  276 180 3.07 3.78 18.0  0  0    3    3
#Pontiac Firebird 19.2   8  400 175 3.08 3.85 17.1  0  0    3    2
#Mazda RX4 Wag    21.0   6  160 110 3.90 2.88 17.0  0  1    4    4
#Toyota Corona    21.5   4  120  97 3.70 2.46 20.0  1  0    3    1
#Merc 280         19.2   6  168 123 3.92 3.44 18.3  1  0    4    4
#Dodge Challenger 15.5   8  318 150 2.76 3.52 16.9  0  0    3    2
#Maserati Bora    15.0   8  301 335 3.54 3.57 14.6  0  1    5    8

#$`2`
#                    mpg cyl  disp  hp drat   wt qsec vs am gear carb
#Duster 360         14.3   8 360.0 245 3.21 3.57 15.8  0  0    3    4
#Honda Civic        30.4   4  75.7  52 4.93 1.61 18.5  1  1    4    2
#Datsun 710         22.8   4 108.0  93 3.85 2.32 18.6  1  1    4    1
#Fiat 128           32.4   4  78.7  66 4.08 2.20 19.5  1  1    4    1
#Valiant            18.1   6 225.0 105 2.76 3.46 20.2  1  0    3    1
#Cadillac Fleetwood 10.4   8 472.0 205 2.93 5.25 18.0  0  0    3    4
#Lotus Europa       30.4   4  95.1 113 3.77 1.51 16.9  1  1    5    2
#Ford Pantera L     15.8   8 351.0 264 4.22 3.17 14.5  0  1    5    4
#.....

答案 1 :(得分:1)

我们可以使用%/%

创建分组变量
n <- 100
grp <- (seq_len(nrow(data))-1) %/%n  + 1
split(data[sample(nrow(data)),], grp)

mtcars为例

f1 <- function(data, n) {
   grp <- (seq_len(nrow(data))-1) %/%n + 1
   split(data[sample(nrow(data)),], grp)
 }

f1(mtcars, 8)