2016-01-05 3 views
0

У меня есть data.table, скажем, dat. Ниже приводится его dputдержите х строк и удалите остаток на 2 столбца

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.Width и Species в данных (который является 2 в приведенном выше примере). Назовем это число x. Ниже приведены комбинации этих 2-х столбцов в данных

Species Petal.Width Frequency 
a   0.2   4 
b   0.2   2 
b   0.4   2 
b   0.1   2  

2) Хранить только x (2 в нашем примере) наблюдений вкось для каждой комбинации столбцов Petal.Width и Species

Когда мы должны держать только 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 

В этом примере, только два случая комбинации (а, 0,2), будут удалены, так как другие комбинации удовлетворяют минимальным критериям частоты.

ответ

2

Первая часть:

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

Вторая часть:

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

'образца (.N, х)' может быть использован вместо 'образца (1: .N, х) '. Кроме того, вы можете использовать '.I' как' dat [dat [, .I [sample (.N, 2)], by = c («Petal.Width», «Species»)] $ V1] 'как показано eddi здесь: http://stackoverflow.com/a/16574176/1191259 – Frank