#r
Вопрос:
Допустим, у меня есть два объекта,
mixed # A tibble: 7 x 2 genus epithet lt;chrgt; lt;chrgt; 1 Vincetoxicum nigrum 2 Rosa multiflora 3 Quercus rubra 4 Acer saccharum 5 Rosa pendula 6 Vincetoxicum nigrum 7 Vincetoxicum nigrum
и
invasives # A tibble: 4 x 2 genus epithet lt;chrgt; lt;chrgt; 1 Larix pendula 2 Picea abies 3 Rosa multiflora 4 Vincetoxicum nigrum
Я хочу проверить, совпадают ли оба столбца «смешанного» с обоими столбцами «инвазивов», и получить индекс, который позволил бы мне извлечь эти совпадения из «смешанного». Обратите внимание, что «pendula» находится в «эпитете» как в «смешанном», так и в «инвазивном», но в соответствующей строке в первом столбце есть «Larix» в «инвазивном» и «Rosa» в «смешанном», поэтому он не включен в конечный продукт.
Поэтому, как только этот индекс был создан, я думаю, что хотел бы запустить:
columns_matched lt;- mixed[index,]
приносящий:
columns_matched # A tibble: 4 x 2 genus epithet lt;chrgt; lt;chrgt; 1 Vincetoxicum nigrum 2 Rosa multiflora 3 Vincetoxicum nigrum 4 Vincetoxicum nigrum
csv-версии таблиц:
genus,epithet Vincetoxicum,nigrum Rosa,multiflora Quercus,rubra Acer,saccharum Rosa,pendula Vincetoxicum,nigrum Vincetoxicum,nigrum genus,epithet Larix,pendula Picea,abies Rosa,multiflora Vincetoxicum,nigrum
Спасибо.
Ответ №1:
Самый простой ответ, который приходит на ум,-это просто inner_join
ваши наборы данных. Таким образом, остаются только одинаковые строки:
library(tidyverse) mixed lt;- read_csv('genus,epithet Vincetoxicum,nigrum Rosa,multiflora Quercus,rubra Acer,saccharum Rosa,pendula Vincetoxicum,nigrum Vincetoxicum,nigrum') #gt; Rows: 7 Columns: 2 #gt; ── Column specification ──────────────────────────────────────────────────────── #gt; Delimiter: "," #gt; chr (2): genus, epithet #gt; #gt; ℹ Use `spec()` to retrieve the full column specification for this data. #gt; ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message. invasives lt;- read_csv('genus,epithet Larix,pendula Picea,abies Rosa,multiflora Vincetoxicum,nigrum') #gt; Rows: 4 Columns: 2 #gt; ── Column specification ──────────────────────────────────────────────────────── #gt; Delimiter: "," #gt; chr (2): genus, epithet #gt; #gt; ℹ Use `spec()` to retrieve the full column specification for this data. #gt; ℹ Specify the column types or set `show_col_types = FALSE` to quiet this message. mixed %gt;% inner_join(invasives) #gt; Joining, by = c("genus", "epithet") #gt; # A tibble: 4 × 2 #gt; genus epithet #gt; lt;chrgt; lt;chrgt; #gt; 1 Vincetoxicum nigrum #gt; 2 Rosa multiflora #gt; 3 Vincetoxicum nigrum #gt; 4 Vincetoxicum nigrum
Если бы вы действительно хотели иметь этот индекс, вы могли бы просто добавить фиктивный столбец в свою смешанную таблицу:
index lt;- mixed %gt;% mutate(index = seq_along(genus)) %gt;% inner_join(invasives) %gt;% pull(index) #gt; Joining, by = c("genus", "epithet") mixed[index,] #gt; # A tibble: 4 × 2 #gt; genus epithet #gt; lt;chrgt; lt;chrgt; #gt; 1 Vincetoxicum nigrum #gt; 2 Rosa multiflora #gt; 3 Vincetoxicum nigrum #gt; 4 Vincetoxicum nigrum
Комментарии:
1. Спасибо! Я бы поднял голос, но у меня недостаточно репутации.
2. Я предполагаю, что последующий вопрос будет таким: что, если бы также было более двух столбцов? В том смысле, что, скажем, у нас был еще один столбец в каждой таблице под названием TaxonRank или что-то в этом роде, просто какой-то другой столбец любого рода, где мы не могли сделать (по крайней мере, из того, что я могу сказать) простое внутреннее соединение. Это все еще работает для меня, но в любом случае, это еще одна вещь, которую я хотел бы знать.
3. используя
by
аргумент-функций объединения, вы можете определить столбцы, к которым хотите присоединиться. Если вы добавляетеby = c('genus','epithet')
в вызов соединения, другие ваши столбцы не должны иметь значения.4. Хорошо, большое спасибо!