2016-03-01 3 views
1

У меня есть data.table как следующийсохранить строки, соответствующие только для некоторых значений в столбце

Sepal.Length Sepal.Width Petal.Length Petal.Width Species pg rem_imp 
1:   5.1   3.5   1.4   0.2  qwe 1  3 
2:   4.9   3.0   1.4   0.2  qwe 1  3 
3:   4.7   3.2   1.3   0.2  qwe 5  3 
4:   4.6   3.1   1.5   0.2  qwe 2  3 
5:   5.0   3.6   1.4   0.2  qwe 2  3 
6:   5.4   3.9   1.7   0.4  qwe 2  3 
7:   4.6   3.4   1.4   0.3  qwe 3  3 
8:   5.0   3.4   1.5   0.2  qwe 3  3 
9:   4.4   2.9   1.4   0.2  qwe 3  3 
10:   4.9   3.1   1.5   0.1  qwe 3  3 
11:   5.4   3.7   1.5   0.2 setosa 11  2 
12:   4.8   3.4   1.6   0.2 setosa 11  2 
13:   4.8   3.0   1.4   0.1 setosa 15  2 
14:   4.3   3.0   1.1   0.1 setosa 15  2 
15:   5.8   4.0   1.2   0.2 setosa 13  2 

structure(list(Sepal.Length = c(5.1, 4.9, 4.7, 4.6, 5, 5.4, 4.6, 
5, 4.4, 4.9, 5.4, 4.8, 4.8, 4.3, 5.8), Sepal.Width = c(3.5, 3, 
3.2, 3.1, 3.6, 3.9, 3.4, 3.4, 2.9, 3.1, 3.7, 3.4, 3, 3, 4), Petal.Length = c(1.4, 
1.4, 1.3, 1.5, 1.4, 1.7, 1.4, 1.5, 1.4, 1.5, 1.5, 1.6, 1.4, 1.1, 
1.2), Petal.Width = c(0.2, 0.2, 0.2, 0.2, 0.2, 0.4, 0.3, 0.2, 
0.2, 0.1, 0.2, 0.2, 0.1, 0.1, 0.2), Species = c("qwe", "qwe", 
"qwe", "qwe", "qwe", "qwe", "qwe", "qwe", "qwe", "qwe", "setosa", 
"setosa", "setosa", "setosa", "setosa"), pg = c(1, 1, 5, 2, 2, 
2, 3, 3, 3, 3, 11, 11, 15, 15, 13), rem_imp = c(3, 3, 3, 3, 3, 
3, 3, 3, 3, 3, 2, 2, 2, 2, 2)), .Names = c("Sepal.Length", "Sepal.Width", 
"Petal.Length", "Petal.Width", "Species", "pg", "rem_imp"), row.names = c(NA, 
-15L), class = c("data.table", "data.frame"), .internal.selfref = <pointer: 0x0000000011eb0788>) 

Я хочу сохранить только те строки, которые соответствуют первым rem_imp значений столбца pg для каждого значения столбца Species , Например, для qwe я хочу сохранить только первые 3 (значение столбца rem_imp) значения столбца pg. И для setosa Я хочу сохранить только первые 2 значения столбца pg.

EDIT: (Подробное объяснение того, что я хочу)

То, что я хочу, чтобы сохранить строки, соответствующие первой rem_imp уникальных значений pg для каждого Species. Например, для qwe я хочу сохранить строки, соответствующие первым 3 уникальным значениям pg. Первые 3 уникальных значения pg для qwe составляют 1,5 и 2, поэтому мы сохраняем строки от 1 до 6. Для setosa первые 2 уникальных значения pg составляют 11 и 25, поэтому мы сохраняем строки от 11 до 14 для setosa.

Результат будет выглядеть как следующий

 Sepal.Length Sepal.Width Petal.Length Petal.Width Species pg rem_imp 
1:   5.1   3.5   1.4   0.2  qwe 1  3 
2:   4.9   3.0   1.4   0.2  qwe 1  3 
3:   4.7   3.2   1.3   0.2  qwe 5  3 
4:   4.6   3.1   1.5   0.2  qwe 2  3 
5:   5.0   3.6   1.4   0.2  qwe 2  3 
6:   5.4   3.9   1.7   0.4  qwe 2  3 
7:   5.4   3.7   1.5   0.2 setosa 11  2 
8:   4.8   3.4   1.6   0.2 setosa 11  2 
9:   4.8   3.0   1.4   0.1 setosa 15  2 
10:   4.3   3.0   1.1   0.1 setosa 15  2 

Я уверен, что это может быть сделано в одном операторе, но я не в состоянии сделать это успешно до сих пор. Я ищу решение синтаксиса data.table (в основном однострочное решение). Я не хочу запускать цикл или что-то в этом роде. Как мне это сделать?

+0

Я не понимаю логики. Не могли бы вы рассказать? –

+0

@docendodiscimus umm ... так что вы сделали то, что вы сохранили первые строки 'rem_imp' для каждого значения' Species'. Я хочу сохранить строки, соответствующие первым 'rem_imp' уникальным значениям' pg' для каждого 'Species'. Например, для 'qwe' я хочу сохранить строки, соответствующие первым 3 уникальным значениям' pg'. Первые 3 уникальных значения 'pg' для' qwe' равны 1,5 и 2, поэтому мы сохраняем строки от 1 до 6. Для 'setosa' первые 2 уникальных значения' pg' равны 11 и 25, поэтому мы сохраняем строки из 11-14 для 'setosa'. Ты понял? – user3664020

+0

Да, это ясно. –

ответ

2

Вот вариант:

dt[dt[, cumsum(!duplicated(pg)) <= rem_imp[1L], by = Species]$V1] 
# Sepal.Length Sepal.Width Petal.Length Petal.Width Species pg rem_imp 
# 1:   5.1   3.5   1.4   0.2  qwe 1  3 
# 2:   4.9   3.0   1.4   0.2  qwe 1  3 
# 3:   4.7   3.2   1.3   0.2  qwe 5  3 
# 4:   4.6   3.1   1.5   0.2  qwe 2  3 
# 5:   5.0   3.6   1.4   0.2  qwe 2  3 
# 6:   5.4   3.9   1.7   0.4  qwe 2  3 
# 7:   5.4   3.7   1.5   0.2 setosa 11  2 
# 8:   4.8   3.4   1.6   0.2 setosa 11  2 
# 9:   4.8   3.0   1.4   0.1 setosa 15  2 
#10:   4.3   3.0   1.1   0.1 setosa 15  2 
+0

Спасибо за внимание, но я не хочу этого. Пожалуйста, взгляните на желаемый результат в моем вопросе. Я не хочу содержать x строк, но строки, соответствующие первым x уникальным значениям столбца 'pg'. – user3664020

+0

@ user3664020, посмотрите обновленный ответ –