在R中的三个数据框中提取相似的变量

时间:2019-05-26 01:55:10

标签: r

所以目前,我有三个数据框:

>df1

 Variable      Val
    a          0.9
    g          0.3
    e          0.1

>df2

 Variable       Val
   h            0.2
   a            0.7
   e            0.9

>df3

 Variable       Val
   z            0.5
   a            0.7
   e            0.9

并且我试图提取出现在所有三个数据框中的变量,在这种情况下为a和e,因为 a e 出现在df1中, df2和df3。

因此我想要的输出是:

[1] a  e

这只是变量,没有val。

我尝试过类似的事情:

similar <- subset(df1, Variable%in% df2$Variable)

但是似乎它只限于两个数据帧而不是三个?

1 个答案:

答案 0 :(得分:0)

一种选择是将数据集放置在list中,提取“变量”列,并获取与intersect相同的元素

Reduce(intersect, lapply(mget(paste0("df", 1:3)), `[[`, "Variable"))
#[1] "a" "e"

tidyverse的类似选项

library(tidverse)
mget(paste0("df", 1:3)) %>%
      map(~ .x %>%
               pull(Variable)) %>%
      reduce(intersect)
#[1] "a" "e"

或者我们将数据集绑定到一个单一的数据集中,按“变量”分组,filter等于3的唯一组数,然后提取“变量”

bind_rows(df1, df2, df3, .id = 'grp') %>%
     group_by(Variable) %>%
     filter(n_distinct(grp) == 3) %>%
     distinct(Variable) %>% 
     pull(Variable)

[1]“ a”“ e”

数据

df1 <- structure(list(Variable = c("a", "g", "e"), Val = c(0.9, 0.3, 
0.1)), class = "data.frame", row.names = c(NA, -3L))

df2 <- structure(list(Variable = c("h", "a", "e"), Val = c(0.2, 0.7, 
0.9)), class = "data.frame", row.names = c(NA, -3L))

df3 <- structure(list(Variable = c("z", "a", "e"), Val = c(0.5, 0.7, 
0.9)), class = "data.frame", row.names = c(NA, -3L))