#r #dataset
Вопрос:
У меня есть набор данных, в котором каждая строка (участник) имеет свой идентификатор
один участник выполнил половину опроса на другом наборе данных:
#first data set
ID<-c(999,998,997)
VAR1<-c(55,32,33)
VAR2<-c(44,22,99)
VAR3<-c(32,11,NA)
VAR4<-c(2,99,NA)
VAR5<-c(9,8,NA)
DF<-data.frame(ID,VAR1,VAR2,VAR3,VAR4,VAR5)
#participant missing answers
ID<-997
VAR1<-NA
VAR2<-NA
VAR3<-22
VAR4<-11
VAR5<-23
DF2<-data.frame(ID,VAR1,VAR2,VAR3,VAR4,VAR5)
как мне присоединиться к отсутствующим переменным участника из DF2 в DF?
Я не нашел ответа на этот вопрос в других вопросах и не преуспел в этом, используя merge()
или full_join()
Спасибо!
Ответ №1:
Мы можем использовать data.table
. Преобразуйте «data.frame» в «data.table» ( setDT(DF)
), соедините с » DF2 » on
столбец «ИДЕНТИФИКАТОР». Получить другие столбцы из обоих наборов данных (‘нм1’ — ‘ВАР’ имена столбцов из первого набора), как и столбцы, такие же, на втором данные, мы используем i.
дифференцировать, mget
возвращает значения столбцов из второй list
, использовать fcoalesce
для colaecse соответствующие столбцы в Map
(Таким образом, что он возвращает первые номера-на элемент) и назначить ( :=
) обратно к исходным данным (‘ДФ’)
library(data.table)
nm1 <- paste0("VAR", 1:5)
setDT(DF)[DF2, (nm1) := Map(function(x, y) fcoalesce(as.numeric(x),
as.numeric(y)), .SD, mget(paste0('i.', nm1))), on = .(ID), .SDcols = nm1]
-выход
> DF
ID VAR1 VAR2 VAR3 VAR4 VAR5
1: 999 55 44 32 2 9
2: 998 32 22 11 99 8
3: 997 33 99 22 11 23
Комментарии:
1. и если DF2-это только:
ID<-997 VAR3<-22 VAR4<-11 VAR5<-23 DF2<-data.frame(ID,VAR3,VAR4,VAR5)
?2. @EladRefoua в таком случае вам может понадобиться
nm1 <- intersect(names(DF1)[-1], names(DF2)[-1])