您将如何使用data.table有效地获取数据框中每个组内的行样本?
DT = data.table(a = sample(1:2), b = sample(1:1000,20))
DT
a b
1: 2 562
2: 1 183
3: 2 180
4: 1 874
5: 2 533
6: 1 21
7: 2 57
8: 1 20
9: 2 39
10: 1 948
11: 2 799
12: 1 893
13: 2 993
14: 1 69
15: 2 906
16: 1 347
17: 2 969
18: 1 130
19: 2 118
20: 1 732
Run Code Online (Sandbox Code Playgroud)
我想的是:DT[ , sample(??, 3), by = a] …
从这些问题- 从R数据帧的子集的行的随机样品 & 在数据帧样本随机行 我可以很容易地看到如何随机抽样(选择)"N"行从DF,或者"n"个来自特定级发起行df中的因子.
以下是一些示例数据:
df <- data.frame(matrix(rnorm(80), nrow=40))
df$color <- rep(c("blue", "red", "yellow", "pink"), each=10)
df[sample(nrow(df), 3), ] #samples 3 random rows from df, without replacement.
Run Code Online (Sandbox Code Playgroud)
例如,从"粉红色"颜色中抽取3个随机行 - 使用library(kimisc):
library(kimisc)
sample.rows(subset(df, color == "pink"), 3)
Run Code Online (Sandbox Code Playgroud)
或编写自定义功能:
sample.df <- function(df, n) df[sample(nrow(df), n), , drop = FALSE]
sample.df(subset(df, color == "pink"), 3)
Run Code Online (Sandbox Code Playgroud)
但是,我想从每个级别的因子中抽取3(或n)个随机行.即新的df将有12行(蓝色3个,红色3个,黄色3个,粉红色3个).显然可以多次运行,为每种颜色创建newdf,然后将它们绑定在一起,但我正在寻找一种更简单的解决方案.
我正在尝试组合一个函数,从我的原始数据框创建一个子集,然后使用dplyr的SELECT和MUTATE根据萼片/花瓣的宽度和长度的总和给出我的大/小条目的数量.
filter <- function (spp, LENGTH, WIDTH) {
d <- subset (iris, subset=iris$Species == spp) # This part seems to work just fine
large <- d %>%
select (LENGTH, WIDTH) %>% # This is where the problem arises.
mutate (sum = LENGTH + WIDTH)
big_samples <- which(large$sum > 4)
return (length(big_samples))
}
Run Code Online (Sandbox Code Playgroud)
基本上,我希望函数返回大花的数量.但是,当我运行该函数时,我得到以下错误 -
filter("virginica", "Sepal.Length", "Sepal.Width")
Error: All select() inputs must resolve to integer column positions.
The following do not:
* LENGTH
* WIDTH
Run Code Online (Sandbox Code Playgroud)
我究竟做错了什么?
给定一个df带有列的数据框group,如何k在dplyr中随机对其进行采样?它应该返回k组中的所有行(假设至少有k唯一值df$group),并且每个组df应该同样可能返回.