在R中组合列表中的公共列

lskq00tm  于 2023-05-11  发布在  其他
关注(0)|答案(2)|浏览(121)

我有一个列表对象如下。

df1 <- data_frame(ID = paste0(LETTERS[1],1:4), valueA = seq(0.1,0.4,0.1), Category= "Apples", valueDEF = seq(0.1,0.4,0.1), valueDEF2 = seq(0.1,0.4,0.1) )
df2 <- data_frame(ID = paste0(LETTERS[1],5:8), valueB = seq(0.1,0.4,0.1),  Category= "Apples2")
df3 <- data_frame(ID = paste0(LETTERS[1],9:12), valueC = seq(0.1,0.4,0.1),  Category= "Apples3")

list1 <- list(df1, df2, df3);list1


  [[1]]
# A tibble: 4 × 5
  ID    valueA Category valueDEF valueDEF2
  <chr>  <dbl> <chr>       <dbl>     <dbl>
1 A1       0.1 Apples        0.1       0.1
2 A2       0.2 Apples        0.2       0.2
3 A3       0.3 Apples        0.3       0.3
4 A4       0.4 Apples        0.4       0.4

[[2]]
# A tibble: 4 × 3
  ID    valueB Category
  <chr>  <dbl> <chr>   
1 A5       0.1 Apples2 
2 A6       0.2 Apples2 
3 A7       0.3 Apples2 
4 A8       0.4 Apples2 

[[3]]
# A tibble: 4 × 3
  ID    valueC Category
  <chr>  <dbl> <chr>   
1 A9       0.1 Apples3 
2 A10      0.2 Apples3 
3 A11      0.3 Apples3 
4 A12      0.4 Apples3

我想把它们合并成一个数据框架的基础上共同列名。
预期答案

ID Category
A1  Apples 
A2  Apples 
A3  Apples 
A4  Apples 
A5  Apples2 
A6  Apples2
A7  Apples2
A8  Apples2 
A9  Apples3 
A10 Apples3 
A11 Apples3 
A12 Apples3

如何解决这个问题?非常感谢。

mrfwxfqh

mrfwxfqh1#

我们可以使用intersect()

  • 为此,我们使用lapply()将列名应用于列表中的每个 Dataframe 。
  • 然后使用intersect()函数将结果列表传递给Reduce()
  • 最后,我们使用bind_rows()获取单个 Dataframe :
library(dplyr) #bind_rows()

common_cols <- Reduce(intersect, lapply(list1, colnames))
df_all <- bind_rows(list1)[common_cols]
ID    Category
   <chr> <chr>   
 1 A1    Apples  
 2 A2    Apples  
 3 A3    Apples  
 4 A4    Apples  
 5 A5    Apples2 
 6 A6    Apples2 
 7 A7    Apples2 
 8 A8    Apples2 
 9 A9    Apples3 
10 A10   Apples3 
11 A11   Apples3 
12 A12   Apples3
anhgbhbe

anhgbhbe2#

作为对TarJae的回答的补充,下面是一个在dplyrselect函数中使用tidyselectwhere函数的一行代码:

library(dplyr)
select(bind_rows(list1) ,
       where(~!any(is.na(.))))

相关问题