Как сравнить и объединить два кадра данных на основе списка в другом кадре данных - PullRequest
0 голосов
/ 01 апреля 2019

У меня есть 3 файла

F1 - par, ch
F2 - ch
F3 - par 

Так что для пары par, ch в F1 я хочу получить значения из F2 и F3.Затем вставьте строки со значениями par в ch слева.

Например,

Если par равен s, а chi равен 9t ===> result: s9t

s apply(row_values(tab),function(name){ paste(name, tab[,name])})

Файл 1: Содержит список Par, ch

F1 <- structure(list(par = structure(c(1L, 2L, 3L, 3L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), ch = structure(c(2L, 3L, 1L,  4L, 5L), .Label = c("a", "b", "c", "d", "e"), class = "factor")), class = "data.frame", row.names = c(NA, -5L))

Файл 2: Содержит ch

F2 <- structure(list(ch = structure(c(2L, 3L, 1L, 4L, 5L), .Label = c("a", "b", "c", "d", "e"), class = "factor"), c1 = structure(c(3L, 
2L, 3L, 4L, 1L), .Label = c("9n", "9NA", "9s", "9t"), class = "factor"), c2 = structure(c(2L, 3L, 1L, 4L, 5L), .Label = c("11f", "11p", "11t", "11x", "11z"), class = "factor")), class = "data.frame", row.names = c(NA, -5L))

Файл 3: Содержит par

F3 <- structure(list(par = structure(c(1L, 2L, 3L, 3L, 4L), .Label = c("a", "b", "c", "d"), class = "factor"), c1 = structure(c(4L, 5L, 3L, 2L, 1L), .Label = c("c", "n", "r", "s", "t"), class = "factor"), c2 = structure(c(4L, 2L, 1L, 3L, 4L), .Label = c("e", "r", "s", "t"), class = "factor")), class = "data.frame", row.names = c(NA, -5L))

result --> вставить значения строки пар в значения строки слева (для пар, пара ch в F1)

result <- structure(list(ch = structure(c(2L, 3L, 1L, 4L, 5L), .Label = c("a", "b", "c", "d", "e"), class = "factor"), c1 = structure(c(4L, 5L, 3L, 2L, 1L), .Label = c("c9n", "n9t", "r9s", "s9s", "t9NA"), class = "factor"), c2 = structure(c(4L, 2L, 1L, 3L, 5L), .Label = c("e11f", "r11t", "s11x", "t11p", "t11z"), class = "factor")), class = "data.frame", row.names = c(NA, -5L))

1 Ответ

1 голос
/ 01 апреля 2019

Описание не соответствует result, поскольку существует несколько совпадений, но при условии, что мы должны вывести каждое из них:

library(sqldf)

sqldf("select a.*, c.c1 || b.c1 as c1, c.c2 || b.c2 as c2
  from F1 a
  join F2 b using(ch)
  join F3 c using(par)")

, что дает:

  par ch   c1   c2
1   a  b  s9s t11p
2   b  c t9NA r11t
3   c  a  n9s s11f
4   c  a  r9s e11f
5   c  d  n9t s11x
6   c  d  r9t e11x
7   d  e  c9n t11z

или эквивалентновыдача того же результата:

n <- 2
cStrings <- toString(sprintf("c.c%d || b.c%d as c%d", 1:n, 1:n, 1:n))
fn$sqldf("select a.*, $cStrings
  from F1 a
  join F2 b using(ch)
  join F3 c using(par)")

Добавьте verbose = TRUE к вызову sqldf, чтобы увидеть фактический оператор SQL, переданный SQLite.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...