#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