rbind данных на основе сопоставления значений в столбце - PullRequest
1 голос
/ 26 мая 2019

У меня есть несколько фреймов данных, которые я хотел бы объединить, но мне нужно избавиться от строк, у которых нет совпадающих значений в столбце в других фреймах данных.Например, я хочу объединить фреймы данных a, b и c на основе значений в столбце x.

a <- data.frame(1:5, 5:9)
colnames(a) <- c("x", "y")
b <- data.frame(1:4, 7:10)
colnames(b) <- c("x", "y")
c <- data.frame(1:3, 6:8)
colnames(c) <- c("x", "y")

и получить результат

1   5
2   6
3   7
1   7
2   8
3   9
1   6
2   7
3   8

, где первыйтри строки взяты из фрейма данных a, вторые три строки - из фрейма данных b, а третьи три строки - из фрейма данных c, и строки, которые не имели совпадающих значений в столбце x, не были включены.

1 Ответ

2 голосов
/ 26 мая 2019

Мы создаем индекс, основанный на intersect инг элементах 'x'

v1 <- Reduce(intersect, list(a$x, b$x, c$x))
rbind(a[a$x %in% v1,], b[b$x %in% v1,], c[c$x %in% v1, ])
#  x y
#1 1 5
#2 2 6
#3 3 7
#4 1 7
#5 2 8
#6 3 9
#7 1 6
#8 2 7
#9 3 8

Если имеется много объектов набора данных, лучше сохранить его в list.Здесь в примере показано, что идентификаторы объекта совершенно разные, но если идентификаторы имеют шаблон, например, df1, df2, ..df100 и т. Д., Становится легче получить его в list

lst1 <- mget(ls(pattern = "^df\\d+$"))

Если идентификаторы объектавсе разные xyz, abc, fq12 и т. д., но это единственные объекты data.frame, загруженные в глобальную среду

lst1 <-  mget(names(eapply(.GlobalEnv, 'is.data.frame')))

Затем получите элементы interesecitng столбца 'x'

v1 <- Reduce(intersect, lapply(lst1, `[[`, "x"))

Используйте пересекающийся вектор для подмножества строк элементов list

do.call(rbind, lapply(lst1, function(x) dat[dat$x %in% v1,]))

Здесь мы предполагаем, что имена столбцов одинаковы во всех наборах данных


Другой вариантсделать merge, а затем unlist

out <- Reduce(function(...) merge(..., by = 'x'), list(a, b, c))
data.frame(x = out$x, y = unlist(out[-1], use.name = FALSE))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...