#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()
или что-то подобное.