在R中从数据框中随机抽取样本

4
我有以下数据框:
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

任何帮助都将不胜感激。
5个回答

8
您可以使用sample()随机选择两个ID。
chosen <- sample(unique(df$id), 2)

然后提取这些记录。
subset(df, id %in% chosen)

4

或者使用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行。 - thelatemail
更新了答案。 - Diego Aguado

1
首先,您需要生成示例索引:
s_ids=sample(unique(df$id),2)

现在您已经拥有了df中适当的记录,可以进行选择。
new_df=df$[df$id %in% s_ids,]

1
如果您有重复的id值,这将无法正常工作。也就是说,在当前数据中,您可能会选择两次“1”。 - thelatemail

0

使用 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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接