按组分组数据组

时间:2017-03-30 15:06:19

标签: r dplyr partitioning

我有以下数据集:

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中这样做

1 个答案:

答案 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