【问题标题】:Random sample from a data frame in R来自 R 中数据帧的随机样本
【发布时间】:2016-05-04 04:42:22
【问题描述】:

我有以下数据框:

id<-c(1,1,2,3,3)
date<-c("23-01-08","01-11-07","30-11-07","17-12-07","12-12-08")
df<-data.frame(id,date)
df$date2<-as.Date(as.character(df$date), format = "%d-%m-%y")

id     date      date2
1   23-01-08 2008-01-23
1   01-11-07 2007-11-01
2   30-11-07 2007-11-30
3   17-12-07 2007-12-17
3   12-12-08 2008-12-12

现在我想提取一个随机的 id 样本而不是行。事实上,我正在寻找一种方法来随机选择两个 id 并提取与它们相关的所有记录。例如,如果它随机选择 id 2 和 3,则输出数据框应如下所示:

id     date      date2
2   30-11-07 2007-11-30
3   17-12-07 2007-12-17
3   12-12-08 2008-12-12

任何帮助将不胜感激。

【问题讨论】:

    标签: r


    【解决方案1】:

    您可以使用sample()随机选择两个ID

    chosen <- sample(unique(df$id), 2)
    

    然后提取那些记录

    subset(df, id %in% chosen)
    

    【讨论】:

      【解决方案2】:

      或使用dplyr

      library(dplyr)
      df %>% 
          filter(id %in% sample(unique(id),2))
      #  id     date      date2
      #1  2 30-11-07 2007-11-30
      #2  3 17-12-07 2007-12-17
      #3  3 12-12-08 2008-12-12
      

      或者

      df %>%
           select(id) %>%
           unique() %>%
           sample_n(2) %>%
           semi_join(df, .)
      #  id     date      date2
      #1  1 23-01-08 2008-01-23
      #2  1 01-11-07 2007-11-01
      #3  2 30-11-07 2007-11-30
      

      【讨论】:

        【解决方案3】:

        你可以使用sample函数。

        set.seed(2)
        df[match(sample(unique(df$id),2),df$id),]
        

        sample() 函数将生成随机索引,然后您可以将它们匹配回您的df 数据框行并获取其余数据。 更多信息请查看?sample

        【讨论】:

        • 这并没有给出预期的结果 - 你总是得到 5 行返回。
        • 更新了答案
        【解决方案4】:

        首先您必须生成示例索引:

        s_ids=sample(unique(df$id),2)
        

        现在您已经在 df 中选择了正确的记录

        new_df=df$[df$id %in% s_ids,]
        

        【讨论】:

        • 如果您有重复的 id 值,这将不起作用。即,在当前数据中,您可能会选择两次1
        【解决方案5】:

        使用 sqldf:

        library(sqldf)
        a <- sqldf("SELECT DISTINCT id FROM df  ORDER BY RANDOM(*) LIMIT 2")
        sqldf("SELECT * FROM df WHERE id IN a")
        

        输出:

          id     date      date2
        1  1 23-01-08 2008-01-23
        2  1 01-11-07 2007-11-01
        3  3 17-12-07 2007-12-17
        4  3 12-12-08 2008-12-12
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-27
          • 1970-01-01
          • 2022-01-07
          • 2012-03-26
          • 1970-01-01
          • 2016-10-31
          • 1970-01-01
          • 2010-09-19
          相关资源
          最近更新 更多