R语言 基于组进行随机抽样
R编程语言为我们提供了许多包,可以从数据对象、数据框架或数据表中提取随机样本,并将它们汇总成组。
方法1:使用plyr库
可以安装 “plyr “库,并将其加载到工作空间中,用来进行数据操作和统计。ddply()方法被应用于指定数据框架的每个子集,然后将结果合并到一个数据框架中。
语法
ddply(.data, .variables, .fun = NULL)
参数 –
data – 要使用的数据框
variables – 分组参数
fun – 要应用的函数。在本例中,应用sample(nrow(x),y)方法,从ddply()方法的第二个参数中选择的变量中提取每组的y行。
例子
# importing required libraries
library("plyr")
# create dataframe
data_frame<-data.frame(col1=c(rep('G1',50),rep('G2',50),rep('G3',50)),
col2=rep(letters[1:5],30)
)
print("Original DataFrame")
head(data_frame)
# pick 3 samples of each from data frame
data_mod <- ddply(data_frame,.(col1),function(x) x[sample(nrow(x),5),])
print("Modified DataFrame")
print (data_mod)
输出
[1] "Original DataFrame"
col1 col2
1 G1 a
2 G1 b
3 G1 c
4 G1 d
5 G1 e
6 G1 a
[1] "Modified DataFrame"
col1 col2
1 G1 d
2 G1 e
3 G1 d
4 G1 a
5 G1 a
6 G2 b
7 G2 c
8 G2 d
9 G2 d
10 G2 e
11 G3 c
12 G3 e
13 G3 b
14 G3 b
15 G3 d
方法2:使用dplyr库
可以安装 “dplyr “库,并将其加载到工作空间,用于执行数据操作。这个包允许大量的方法来过滤、子集和提取基于应用约束和条件的数据。数据框架使用管道操作符进行多种操作。
group_by方法是用来根据特定列中包含的组来划分和隔离日期的。需要分组的列被指定为这个函数的一个参数。它可以包含多个列名。
语法
group_by(col1, col2, ...)
随后应用sample_n()方法从数据框中选择随机行,参数为从每组中抽出的行数。
例子
# importing required libraries
library("dplyr")
# create dataframe
data_frame<-data.frame(col1=c(rep('G1',50),rep('G2',50),
rep('G3',50)),
col2=rep(letters[1:5],30)
)
print("Original DataFrame")
head(data_frame)
# pick 3 samples of each from data frame
data_mod <- data_frame %>% group_by(col1) %>% sample_n(3)
print("Modified DataFrame")
print (data_mod)
输出
[1] "Original DataFrame"
col1 col2
1 G1 a
2 G1 b
3 G1 c
4 G1 d
5 G1 e
6 G1 a
[1] "Modified DataFrame"
# A tibble: 9 x 2
# Groups: col1 [3]
col1 col2
<chr> <chr>
1 G1 d
2 G1 e
3 G1 c
4 G2 a
5 G2 a
6 G2 c
7 G3 b
8 G3 a
9 G3 a
方法3:使用data.table
库data.table可以用来快速汇总组织成表格结构的大量数据。该包可以被加载并安装到工作空间中。
数据表的索引可以使用.SD参数进行,该参数使用 “by “参数选择一个样本分组数据。从每组中选择的行数取决于索引方法中指定的大小属性。输出结果以data.table的形式返回。
语法
data_frame[ , .SD[sample(x = .N, size = n)], by = ]
例子
# importing required libraries
library("data.table")
# create dataframe
data_frame<-data.table(col1=c(rep('G1',50),rep('G2',50),
rep('G3',50)),
col2=rep(letters[1:5],30)
)
print("Original DataFrame")
head(data_frame)
# pick 3 samples of each from data frame
data_mod <- data_frame[, .SD[sample(x = .N, size = 5)], by = col1]
print("Modified DataFrame")
print (data_mod)
输出
[1] "Original DataFrame"
col1 col2
1: G1 a
2: G1 b
3: G1 c
4: G1 d
5: G1 e
6: G1 a
[1] "Modified DataFrame"
col1 col2
1: G1 a
2: G1 e
3: G1 d
4: G1 e
5: G1 a
6: G2 c
7: G2 c
8: G2 c
9: G2 d
10: G2 e
11: G3 b
12: G3 e
13: G3 d
14: G3 d
15: G3 d