Условная фильтрация с данными.таблица с несколькими операторами

#r #data.table #subset

#r #данные.таблица #подмножество

Вопрос:

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

Моя цель заключается в следующем: если условие 1 выполнено, отфильтруйте на основе условия 2.

Например, в случае набора данных iris, как я могу отбросить наблюдения среди Species=="setosa" где Sepal.Lengthlt;5.5 , сохраняя при этом все наблюдения Sepal.Lengthlt;5.5 для других видов?

Я знаю, как это сделать поэтапно, но мне интересно, есть ли лучший способ сделать это в одном лайнере

 # this is how I would do it in steps.   data("iris")  # first only select observations in setosa I am interested in keeping  iris1lt;- setDT(iris)[Sepal.Lengthgt;=5.5amp;Species=="setosa"]   # second, drop all of setosa observations.  iris2lt;- setDT(iris)[Species!="setosa"]   # join data, iris_finallt;-full_join(iris1,iris2)  head(iris_final)  Sepal.Length Sepal.Width Petal.Length Petal.Width Species 1: 5.8 4.0 1.2 0.2 setosa 2: 5.7 4.4 1.5 0.4 setosa 3: 5.7 3.8 1.7 0.3 setosa 4: 5.5 4.2 1.4 0.2 setosa 5: 5.5 3.5 1.3 0.2 setosa # only keeping setosa with Sepal.Lengthgt;=5.5. Note that for other species, Sepal.Length can be lt;5.5 6: 7.0 3.2 4.7 1.4 versicolor  

есть ли более лаконичный и элегантный способ сделать это?

Ответ №1:

Является ли что-то вроде следующего тем, что вы ищете? Не очень понятно, чего вы хотите.

 library(data.table)  dt lt;- data.table(iris) dt[Sepal.Length gt;= 5.5 amp; Species == "setosa" | Species != "setosa"]  #gt; Sepal.Length Sepal.Width Petal.Length Petal.Width Species #gt; 1: 5.8 4.0 1.2 0.2 setosa #gt; 2: 5.7 4.4 1.5 0.4 setosa #gt; 3: 5.7 3.8 1.7 0.3 setosa #gt; 4: 5.5 4.2 1.4 0.2 setosa #gt; 5: 5.5 3.5 1.3 0.2 setosa #gt; ---  #gt; 101: 6.7 3.0 5.2 2.3 virginica #gt; 102: 6.3 2.5 5.0 1.9 virginica #gt; 103: 6.5 3.0 5.2 2.0 virginica #gt; 104: 6.2 3.4 5.4 2.3 virginica #gt; 105: 5.9 3.0 5.1 1.8 virginica  

Ответ №2:

Вы можете использовать оператор | или:

Это требует удаления любых строк, где Species=="setosa" amp; Sepal.Lengthlt;5.5 и сохранения строк, где Sepal.Lengthgt;5.5

 iris1[!(Species=="setosa" amp; Sepal.Lengthlt;5.5) | Sepal.Lengthgt;5.5]  
 Sepal.Length Sepal.Width Petal.Length Petal.Width Species  1: 5.8 4.0 1.2 0.2 setosa  2: 5.7 4.4 1.5 0.4 setosa  3: 5.7 3.8 1.7 0.3 setosa  4: 5.5 4.2 1.4 0.2 setosa  5: 5.5 3.5 1.3 0.2 setosa  ---  101: 6.7 3.0 5.2 2.3 virginica 102: 6.3 2.5 5.0 1.9 virginica 103: 6.5 3.0 5.2 2.0 virginica 104: 6.2 3.4 5.4 2.3 virginica 105: 5.9 3.0 5.1 1.8 virginica