Создайте новый список в R на основе совпадающих значений из двух данных.кадры

#r #dataframe #merge

#r #фрейм данных #поглощать

Вопрос:

У меня есть фрейм данных, который выглядит так:

 dflt;-data.frame(x=c('x1','x2','x3','x4','x5'),y=c(1,2,3,4,5)) df2lt;-data.frame(x=c('x3','x5'),y=c(3,5))  df3lt;-merge(df,df2,by="x")  

Как мне создать список из 0 и 1 на основе df того, совпадали ли значения x со значениями df2 x ? Например, новый фрейм данных будет выглядеть следующим образом:

newdflt;-data.frame(x=c('x1','x2','x3','x4','x5'),y=c(1,2,3,4,5),match=c(0,0,1,0,1)

Ответ №1:

Использование data.table (сопоставление по x и y ):

 library(data.table) setDT(df) df[, match := 0L] df[df2, on = .(x, y), match := 1L] # x y match # 1: x1 1 0 # 2: x2 2 0 # 3: x3 3 1 # 4: x4 4 0 # 5: x5 5 1  

Комментарии:

1. Спасибо! У меня есть аналогичная проблема, где теперь df2-это список фреймов данных. Есть ли способ сопоставить df каждый фрейм данных в списке и создать новый столбец для каждого соответствия?

2. Вы могли бы использовать цикл for.

Ответ №2:

base Решение для воссоздания вашего newdf :

 newdf lt;- df newdf$match lt;- ifelse(df$x %in% df2$x, 1, 0)  

Или, используя tidyverse синтаксис:

 library(tidyverse)  df %gt;%  mutate(match = ifelse(x %in% df2$x, 1, 0))  

Комментарии:

1. Спасибо! У меня есть аналогичная проблема, где теперь df2-это список фреймов данных. Есть ли способ сопоставить df каждый фрейм данных в списке и создать новый столбец для каждого соответствия?

2. Да, это тоже можно сделать-вероятно, стоит задать отдельный вопрос с некоторыми воспроизводимыми образцами данных для него. Основная идея (при base tidyverse использовании подхода или) состояла бы в том, чтобы запустить lapply() над вашим списком анонимную функцию внутри, которая выглядит так, как описано выше, а затем связать строки вместе-что-то вроде lapply(mylist, function(y) {ifelse(df$x %in% y$x)}) , за которым следует rbind() или что-то подобное.