R:匹配数据框列表中的特定元素并创建新的数据框

时间:2019-04-26 17:46:32

标签: r list dataframe data-manipulation

让我们列出数据帧列表:

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 个答案:

答案 0 :(得分:1)

也许某处有更好的解决方案,但这是有可能的:

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" 

答案 1 :(得分:0)

您可以使用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做过一次,您可以为两者运行第三行,然后合并向量并转换为数据帧。