【问题标题】:R - Select rows for random sample of column values?R - 为列值的随机样本选择行?
【发布时间】:2011-08-22 01:45:38
【问题描述】:

如何为随机列值样本选择所有行?

我有一个如下所示的数据框:

tag  weight

R007     10
R007     11
R007      9
J102     11
J102      9
J102     13
J102     10
M942      3
M054      9
M054     12  
V671     12
V671     13
V671      9
V671     12
Z990     10
Z990     11

您可以使用...进行复制

weights_df <- structure(list(tag = structure(c(4L, 4L, 4L, 1L, 1L, 1L, 1L, 
3L, 2L, 2L, 5L, 5L, 5L, 5L, 6L, 6L), .Label = c("J102", "M054", 
"M942", "R007", "V671", "Z990"), class = "factor"), value = c(10L, 
11L, 9L, 11L, 9L, 13L, 10L, 3L, 9L, 12L, 12L, 14L, 5L, 12L, 11L, 
15L)), .Names = c("tag", "value"), class = "data.frame", row.names = c(NA, 
-16L))

我需要为两个随机采样的标签创建一个包含上述数据框中所有行的数据框。假设随机选择标签 R007 和 M942,我的新数据框需要如下所示:

tag  weight

R007     10
R007     11
R007      9
M942      3

我该怎么做?

我知道我可以像这样创建一个包含两个随机标签的列表:

library(plyr)
tags <- ddply(weights_df, .(tag), summarise, count = length(tag))
set.seed(5464)
tag_sample <- tags[sample(nrow(tags),2),]
tag_sample

导致...

   tag count
4 R007     3
3 M942     1

但我只是不知道如何使用它来子集我的原始数据框。

【问题讨论】:

    标签: r sample subset


    【解决方案1】:

    这是你想要的吗?

    subset(weights_df, tag%in%sample(levels(tag),2))
    

    【讨论】:

    • 你明白了 :) 谢谢!我其实是想找一个类似 SQL 的“in”操作符,但是什么都没想出来。
    • 不错的一个。虽然我认为你不需要调用 levels 函数。
    • @Ramnath 这里levels 是必要的。
    • 我现在明白为什么有必要了。唯一的问题是,如果 OP 将标签编码为字符,则 levels 将失败。也许unique(tag) 可能是更好的选择
    • @Ramnath - 我刚刚遇到了使用不同数据框的字符问题。我按照你的建议做了,将levels 换成unique,它奏效了!谢谢!
    【解决方案2】:

    如果你的data.frame被命名为dfrm,那么这将随机选择100个tags

    dfrm[ sample(NROW(dfrm), 100), "tag" ]   # possibly with repeats
    

    另一方面,如果您想要一个具有相同列(可能有重复)的数据框:

    samp <- dfrm[ sample(NROW(dfrm), 100),  ]  # leave the col name entry blank to get all
    

    第三种可能性...您希望随机使用 100 个不同的标签,但完全没有加权到频率的概率:

    samp.tags <- unique(dfrm$tag)[ sample(length(unique(dfrm$tag)), 100]
    

    编辑:修改后的问题;其中之一:

     subset(dfrm, tag %in% c("R007", "M942") )
    

    或者:

    dfrm[dfrm$tag %in% c("R007", "M942"), ]
    

    或者:

    dfrm[grep("R007|M942", dfrm$tag), ]
    

    【讨论】:

    • 对不起,伙计,我不确定我最初的问题是否很清楚,所以我不相信你的回答适用于我试图做的事情。更新后的问题是否更有意义?
    • 将子集或“[”与%in%一起使用会很简单
    猜你喜欢
    • 2020-07-16
    • 1970-01-01
    • 1970-01-01
    • 2018-03-04
    • 2021-06-28
    • 1970-01-01
    • 1970-01-01
    • 2017-08-27
    相关资源
    最近更新 更多