对数据框中的随机行进行采样
我正在努力寻找合适的函数来返回从 R 语言的数据框中随机选取的指定行数而不进行替换?有人可以帮我吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
我正在努力寻找合适的函数来返回从 R 语言的数据框中随机选取的指定行数而不进行替换?有人可以帮我吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(13)
首先制作一些数据:
然后随机选择一些行:
First make some data:
Then select some rows at random:
约翰·科尔比给出的答案是正确的答案。但是,如果您是
dplyr
用户,还有答案sample_n
:从数据帧中随机采样 10 行。它调用
sample.int
,因此实际上是相同的答案,但输入较少(并且简化了在 magrittr 上下文中的使用,因为数据帧是第一个参数)。The answer John Colby gives is the right answer. However if you are a
dplyr
user there is also the answersample_n
:randomly samples 10 rows from the dataframe. It calls
sample.int
, so really is the same answer with less typing (and simplifies use in the context of magrittr since the dataframe is the first argument).data.table
包提供了DT[sample(.N, M)]
函数,从数据表DT
中采样M 个随机行。The
data.table
package provides the functionDT[sample(.N, M)]
, sampling M random rows from the data tableDT
.写一篇吧!包装 JC 的答案给了我:
现在通过首先检查是否 n<=nrow(df) 并停止并出现错误来使其更好。
Write one! Wrapping JC's answer gives me:
Now make it better by checking first if n<=nrow(df) and stopping with an error.
只是为了完整起见:
dplyr 还提供通过以下方式绘制样本的比例或分数。
这非常方便,例如在机器学习中,当您必须执行特定的分割比(例如 80%:20%)时
Just for completeness sake:
dplyr also offers to draw a proportion or fraction of the sample by
This is very convenient e.g. in machine learning when you have to do a certain split ratio like 80%:20%
正如 @matt_b 所示,
sample_n()
&sample_frac()
已被软弃用,取而代之的是slice_sample()
。请参阅 dplyr 文档。文档字符串示例:
As @matt_b indicates,
sample_n()
&sample_frac()
have been soft deprecated in favour ofslice_sample()
. See the dplyr docs.Example from docstring:
在我的R包中,有一个函数
sample.rows
专门用于此目的目的:根据 Joris Meys 对 sample 是一个坏主意href="https://stackoverflow.com/a/16538269/946850">上一个答案。
In my R package there is a function
sample.rows
just for this purpose:Enhancing
sample
by making it a generic S3 function was a bad idea, according to comments by Joris Meys to a previous answer.编辑:此答案现已过时,请参阅更新版本。
在我的R包中,我增强了
sample
,因此它现在的行为如下数据帧也是如此:这是实现的使
sample
成为 S3 通用方法并在函数中提供必要的(简单的)功能。调用setMethod
可以解决所有问题。原始实现仍然可以通过base::sample
访问。EDIT: This answer is now outdated, see the updated version.
In my R package I have enhanced
sample
so that it now behaves as expected also for data frames:This is achieved by making
sample
an S3 generic method and providing the necessary (trivial) functionality in a function. A call tosetMethod
fixes everything. The original implementation still can be accessed throughbase::sample
.你可以这样做:
上面我刚刚制作了一个包含 10 列和 100 行的数据框,好吗?
现在您可以使用
sample_n
对其进行采样:You could do this:
Above I just made a dataframe with 10 columns and 100 rows, ok?
Now you can sample it with
sample_n
:2021 年在 tidyverse 中执行此操作的方法是:
由 reprex 包于 2021 年 10 月 5 日创建 (v2.0.0.9000)
The 2021 way of doing this in the tidyverse is:
Created on 2021-10-05 by the reprex package (v2.0.0.9000)
从 R 中的 tibble 类型中选择随机样本:
nrow 接受一个 tibble 并返回行数。传递给
sample
的第一个参数是从 1 到 tibble 末尾的范围。传递给样本的第二个参数 150 是您想要的随机采样数量。方括号切片指定返回索引的行。变量“a”获取随机采样的值。Select a Random sample from a tibble type in R:
nrow takes a tibble and returns the number of rows. The first parameter passed to
sample
is a range from 1 to the end of your tibble. The second parameter passed to sample, 150, is how many random samplings you want. The square bracket slicing specifies the rows of the indices returned. Variable 'a' gets the value of the random sampling.你可以这样做:
You could do this:
我是 R 新手,但我使用的是这种对我有用的简单方法:
PS:请随意注意它是否有一些我没有考虑到的缺点。
I'm new in R, but I was using this easy method that works for me:
PS: Feel free to note if it has some drawback I'm not thinking about.