R сопоставьте два столбца символов в одном тиббле с двумя другими столбцами символов в другом тиббле

#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. Хорошо, большое спасибо!