R: сопоставить конкретные элементы из списка фреймов данных и создать новый фрейм данных - PullRequest
0 голосов
/ 26 апреля 2019

Давайте составим список фреймов данных:

df1 <- data.frame(V1=c("a", "b", "c"),V2=c("d", "e","f"), V3=c("g","h","i"),V4=c("j","k","l"))
df2 <- data.frame(V1=c("m","n"), V2=c("o","p"), V3=c("q","r"))
l <-list(df1, df2)
> l
[[1]]
  V1 V2 V3 V4
1  a  d  g  j
2  b  e  h  k
3  c  f  i  l

[[2]]
  V1 V2 V3
1  m  o  q
2  n  p  r

Более того, у нас есть вектор:

ele <- c("a","b","e","g","i","m","p","s","t")

Я хочу получить новый фрейм данных, построенный путем сопоставления элементов из вектора ele и списка l. Фрейм данных должен иметь имена столбцов из совпадающих элементов из вектора и элемента прямо в соответствии с элементами из списка. Например:

df3 <-data.frame(a="d",b='e',e="h",g="j",i="l",m="o",p="r")
> df3
  a b e g i m p
1 d e h j l o r

Как вы можете заметить, не существует специального соответствия.

Ответы [ 2 ]

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

Возможно, где-то есть лучшие решения, но это возможно:

library(tidyverse)
library(magrittr)

l %<>%
  map(~ t(.x) %>% 
        as_tibble() %>% 
        flatten_chr())


ele %>%
  map(~ map(l, equals, .x)) %>% 
  map_chr(~ {
    lgl <- map_lgl(.x, any)
    if (!any(lgl)) {
      NA
    } else {
      lgl_idx <- min(which(lgl))
      lgl     <- l[[lgl_idx]]
      lgl[min(which(.x[[lgl_idx]])) + 1]
    }
  }) %>%
  set_names(ele) %>%
  na.omit()

Требуется дополнительная обработка исключений (например, когда вектор равен элементу в последнем столбце), но он работает на приведенном вами примере.

  a   b   e   g   i   m   p 
"d" "e" "h" "j" "l" "o" "r" 
0 голосов
/ 26 апреля 2019

Вы можете выделить элемент, соответствующий аргументу, используя which, а затем добавить к нему вектор (в данном случае c(0,1)).

ele_list = as.list(ele)
names(ele_list) = ele
unlist(lapply(ele_list, function(e) df1[which(df1 == e, arr.ind = TRUE)  + c(0, 1)]))

  a   b   e   g   i 
"d" "e" "h" "j" "l" 

Я сделал это только для df1, вы можете запустить третью строку для обоих, затем объединить векторы и преобразовать в dataframe.

...