我有以下数据集:
df<- as.data.frame(c(rep("a", times = 9), rep("b", times = 18), rep("c", times = 27)))
colnames(df)<-"Location"
Year<-c(rep(1:3,times = 3), rep(1:6, times = 3), rep(1:9, times = 3))
df$Year<-Year
df<- df %>%
mutate(Predictor = seq_along(Location)) %>%
ungroup(df)
print(df)
Location Year Predictor
a 1 1
a 2 2
a 3 3
a 1 4
a 2 5
a 3 6
a 1 7
a 2 8
a 3 9
b 1 10
b 2 11
b 3 12
b 4 13
b 5 14
... 40 more rows
我想将上述数据框分成训练和测试集。对于测试集,我想随机抽样每个位置的年数的三分之一,同时将年份保持在一起。所以如果一年&#34; 1&#34;我选择了所有三个&#34; 1&#34在测试集等等。我的测试集看起来应该是这样的:
Location Year Predictor
a 1 1
a 1 4
a 1 7
b 3 12
b 3 18
b 3 24
b 5 14
b 5 20
b 5 26
c 3 30
c 3 39
c 3 48
c 6 33
c 6 42
c 6 51
c 7 34
c 7 43
c 7 52
我发现了一个类似的问题here,但是这个程序会在同一年和每个位置抽样相同的年份(YEAR是数字,而不是因素)。我想要从每个位置获得不同的年份随机样本和比例数量的样本。
如果可能的话,想在dplyr中这样做
答案 0 :(得分:2)
您可以先创建一组不同的年份/位置组合,然后为每个位置采样一些,并在原始数据的semi_join
中使用该组合。这可以这样做:
df %>%
distinct(Location, Year) %>%
group_by(Location) %>%
sample_frac(.3) %>%
semi_join(df, .)
# Location Year Predictor
# 1 a 3 3
# 2 a 3 6
# 3 a 3 9
# 4 b 4 13
# 5 b 4 19
# 6 b 4 25
# 7 b 5 14
# 8 b 5 20
# 9 b 5 26
# 10 c 8 35
# 11 c 8 44
# 12 c 8 53
# 13 c 1 28
# 14 c 1 37
# 15 c 1 46
# 16 c 2 29
# 17 c 2 38
# 18 c 2 47