Как привязать столбец к тому же значению с идентификатором, но зарезервировать переменную другой длины

#r

#r

Вопрос:

Предположим, что A-это все данные, которые должны отображаться для всех идентификаторов и годов, а B-данные, которые фактически представлены. Из информации в разделе B видно, что не все идентификаторы отображаются в каждом выпуске, поэтому я хочу знать, какой идентификатор не предоставлял информацию в те годы. И обозначим его как NA. ИТАК… есть два кадра данных A и B, следующих вниз,

 id lt;- c(1, 1, 1, 2, 2, 2, 3, 3, 3) year lt;- c(2000, 2001, 2002, 2000, 2001, 2002, 2000, 2001, 2002) A lt;- data.frame(id, year); colnames(A) lt;- c("ID", "year") # id lt;- c(1, 1, 1, 2, 2, 3) year lt;- c(2000, 2001, 2002, 2001, 2002, 2002) B lt;- data.frame(id, year); colnames(B) lt;- c("ID", "year") cbind(A, B)  

Если бы я попытался использовать функцию слияния, это было бы похоже…

 merge(A, B, by = "ID", all = TRUE)  

но я ожидал, что мой новый фрейм данных будет таким…

 id lt;- c(1, 1, 1, 2, 2, 2, 3, 3, 3) year.x lt;- c(2000, 2001, 2002, 2000, 2001, 2002, 2000, 2001, 2002) year.y lt;- c(2000, 2001, 2002, NA, 2001, 2002, NA, NA, 2002) D lt;- data.frame(id, year.x, year.y); D  

Спасибо!

Ответ №1:

Один из способов-сопоставить оба столбца, т. е.

 A$year.y lt;- A$year[match(do.call(paste0, A), do.call(paste0, B))]    ID year year.y 1 1 2000 2000 2 1 2001 2001 3 1 2002 2002 4 2 2000 NA 5 2 2001 2000 6 2 2002 2001 7 3 2000 NA 8 3 2001 NA 9 3 2002 2002  

Ответ №2:

Обновленная data.table альтернатива для каждого A$id , которая соответствует a B$id , сравнивает A$year B$year и классифицирует их как MATCH или NO MATCH в столбце matched a на основе того, идентичны они или нет.

 id lt;- c(1, 1, 1, 2, 2, 2, 3, 3, 3) year lt;- c(2000, 2001, 2002, 2000, 2001, 2002, 2000, 2001, 2002) A lt;- data.frame(id, year); colnames(A) lt;- c("ID", "year.x") #  id lt;- c(1, 1, 1, 2, 2, 3) year lt;- c(2000, 2001, 2002, 2001, 2002, 2002) B lt;- data.frame(id, year); colnames(B) lt;- c("ID", "year.y")    A %gt;% inner_join(B, by = 'ID') %gt;%  mutate(matched = c('no_match', 'match')[1   (year.x == year.y)])     ID year.x year.y matched 1 1 2000 2000 match 2 1 2000 2001 no_match 3 1 2000 2002 no_match 4 1 2001 2000 no_match 5 1 2001 2001 match 6 1 2001 2002 no_match 7 1 2002 2000 no_match 8 1 2002 2001 no_match 9 1 2002 2002 match 10 2 2000 2001 no_match 11 2 2000 2002 no_match 12 2 2001 2001 match 13 2 2001 2002 no_match 14 2 2002 2001 no_match 15 2 2002 2002 match 16 3 2000 2002 no_match 17 3 2001 2002 no_match 18 3 2002 2002 match