#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