保留x行并删除2列

时间:2016-01-05 13:13:04

标签: r data.table unique reshape reshape2

我有一个data.table说,dat。以下是dput

structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, 
5, 4.4, 4.9), Sepal.Width = c(3.5, 3, 3.2, 3.1, 3.6, 3.9, 3.4, 
3.4, 2.9, 3.1), Petal.Length = c(1.4, 1.4, 1.3, 1.5, 1.4, 1.7, 
1.4, 1.5, 1.4, 1.5), Petal.Width = c(0.2, 0.2, 0.2, 0.2, 0.2, 
0.4, 0.4, 0.2, 0.1, 0.1), Species = c("a", "a", "a", "a", "b", 
"b", "b", "b", "b", "b")), .Names = c("Sepal.Length", "Sepal.Width", 
"Petal.Length", "Petal.Width", "Species"), row.names = c(NA, 
-10L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000000000330788>)


dat

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
 1:          5.1         3.5          1.4         0.2       a
 2:          4.9         3.0          1.4         0.2       a
 3:          4.7         3.2          1.3         0.2       a
 4:          4.6         3.1          1.5         0.2       a
 5:          5.0         3.6          1.4         0.2       b
 6:          5.4         3.9          1.7         0.4       b
 7:          4.6         3.4          1.4         0.4       b
 8:          5.0         3.4          1.5         0.2       b
 9:          4.4         2.9          1.4         0.1       b
10:          4.9         3.1          1.5         0.1       b

我想做以下事情,

1)计算数据中Petal.WidthSpecies列的任意组合的最小频率(上例中为2)。我们将此号码称为x。以下是数据

中这两列的组合
Species    Petal.Width  Frequency
a           0.2           4
b           0.2           2 
b           0.4           2
b           0.1           2    

2)对于xPetal.Width

列的每个组合,只保留Species(在我们的示例中为2)观察值随机

当我们在这种情况下必须随机保留1个案例时,我们

dat <- unique(dat, by = c("Petal.Width", "Species")

但是,当我们想要保留x个案例而不仅仅是1个(太随机)时,我们该怎么做?

输出可能如下所示

    Sepal.Length Sepal.Width Petal.Length Petal.Width Species
 2:          4.9         3.0          1.4         0.2       a
 4:          4.6         3.1          1.5         0.2       a
 5:          5.0         3.6          1.4         0.2       b
 6:          5.4         3.9          1.7         0.4       b
 7:          4.6         3.4          1.4         0.4       b
 8:          5.0         3.4          1.5         0.2       b
 9:          4.4         2.9          1.4         0.1       b
10:          4.9         3.1          1.5         0.1       b

在此示例中,只有2种情况的组合(a,0.2)将被删除,因为其他组合符合最低频率标准。

1 个答案:

答案 0 :(得分:2)

第一部分:

x <- dat[, .N, by = list(Species, Petal.Width)][, min(N)]

第二部分:

dat[, .SD[sample(1:.N, x)], by = list(Species, Petal.Width)]