让我们列出数据帧列表:
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
您可能会注意到没有特定的匹配模式。
答案 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
做过一次,您可以为两者运行第三行,然后合并向量并转换为数据帧。