我有以下具有1000行的数据框; 10个城市,每个城市有100行,我想按城市中的Year随机选择10个名称,并且应该选择10个样本名称应至少来自该城市中至少一个年份,即城市1的10个名称不应来自例如从1996年开始。
City Year name
1 1 1996 b
2 1 1996 c
3 1 1997 d
4 1 1997 e
...
101 2 1996 f
102 2 1996 g
103 2 1997 h
104 2 1997 i
所需的最终样品数据
City Year name
1 1 1996 b
2 1 1998 c
3 1 2001 d
...
11 2 1997 g
12 2 1999 h
13 2 2005 b
...
21 3 1998 a
22 3 2010 c
23 3 2005 d
样本数据
df1 <- data.frame(City = rep(1:10, each = 100),
Year = rep(1996:2015, each = 5),
name = rep(letters[1:25], 40))
我无法为所有10个城市按年随机选择10个样本名称(不重复年份-除非城市的年数少于10年),该如何解决?
最终抽样应在每个城市中使用10个名称,除非该城市中的名称少于10个,否则不应重复年份。
谢谢。
答案 0 :(得分:1)
首先按City
分组,然后使用sample_n
对子数据帧进行采样。
然后按City
和Year
分组,并从sample
中按name
每组一个元素。不要忘记设置RNG种子以使结果可重复。
library(dplyr)
set.seed(2020)
df1 %>%
group_by(City) %>%
sample_n(min(n(), 10)) %>%
ungroup() %>%
group_by(City, Year) %>%
summarise(name = sample(name, 1))
#`summarise()` regrouping output by 'City' (override with `.groups` argument)
## A tibble: 4 x 3
## Groups: City [2]
# City Year name
# <int> <int> <chr>
#1 1 1996 b
#2 1 1997 e
#3 2 1996 f
#4 2 1997 h
数据
df1 <- read.table(text = "
City Year name
1 1 1996 b
2 1 1996 c
3 1 1997 d
4 1 1997 e
101 2 1996 f
102 2 1996 g
103 2 1997 h
104 2 1997 i
", header = TRUE)
不是重新发明轮子,而是使用软件包sampling
,函数strata
获取数据集中的索引,然后filter
包含其对应的行。
library(dplyr)
library(sampling)
set.seed(2020)
df1 %>%
mutate(row = row_number()) %>%
filter(row %in% strata(df1, stratanames = c('City', 'Year'), size = rep(1, 1000), method = 'srswor')$ID_unit) %>%
select(-row) %>%
group_by(City) %>%
sample_n(10) %>%
arrange(City, Year)