【问题标题】:find the union of a column between matched rows of data frames of a list in r在 r 中找到列表的匹配数据帧行之间的列的并集
【发布时间】:2022-01-01 01:36:25
【问题描述】:

我有一个数据框列表。当数据框之间的列名称匹配时,我想在所有数据框中取列值的并集。

这是一个玩具数据。

df1 <- data.frame(group = c("G1", "G1", "G1", "G1", "G1", "G2", "G2", "G2", "G1", "G1"), 
              Name = c("B", "B","B", "A", "A",'D',"D" , "E", "C", "C"), value = c(2,4,5,2,4,7, 1, 2,4,1))
df2 <- data.frame(group = c("G1", "G1", "G1", "G1", "G2", "G2", "G2", "G2" , "G1", "G1"), 
              Name = c("B", "B" , "A", "A", "D", "E", "E", "E", "C", "C"), value = c(2, 3, 5, 1, 7, 2, 4, 8, 9,1))
df <- rbind(df1, df2)

df.list <- split(df, f=df$group)

愿望输出如下:

  B = 2,3,4,5
  A = 1,2,4,5
  D = 1,7
  E = 2,4,8
  C = 1,4,9

【问题讨论】:

  • 你能澄清group在这个问题中的作用吗?输出似乎不依赖它。
  • 该组对应于我列表中的项目。我需要数据框名称(每个列表项)匹配的值的联合。

标签: r list dataframe dplyr union


【解决方案1】:

我将使用 tidyverse 来解决问题,并假设所需的输出是向量列表。在解决方案中,我确保只保留df1df2 之间共有的Name

library(tidyverse)
bind_rows(df1, df2) %>% 
  filter(Name %in% df1$Name, Name %in% df2$Name) %>%
  split(.$Name) %>% 
  map(~ sort(unique(.x$value)))

输出:

$A
[1] 1 2 4 5

$B
[1] 2 3 4 5

$C
[1] 1 4 9

$D
[1] 1 7

$E
[1] 2 4 8

如果有两个以上的数据框,您可以将它们全部放在一个列表中,并使用适用于任意数量数据框的解决方案。

library(tidyverse)
dfs = list(df1, df2)
# First identify the common names within the data frames
common_names = dfs %>%
  map(`[[`, "Name") %>%
  reduce(intersect)
common_names
#> [1] "B" "A" "D" "E" "C"

# Now we can do the same thing as earlier
dfs %>%
  reduce(bind_rows) %>%
  filter(Name %in% common_names) %>%
  split(.$Name) %>%
  map(~ sort(unique(.x$value)))

【讨论】:

  • 嗨,谢谢。实际上有两个以上的数据帧。我正在尝试这个解决方案,但出现了这个错误。 (函数(类,fdef,mtable)中的错误:无法找到签名“列表”的函数“reduce”的继承方法
  • 似乎这正在解决问题。咕噜声::减少
  • 是的,好电话。如果你加载 tidyverse (library(tidyverse)) 也可以。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-08-20
  • 2016-04-13
  • 1970-01-01
  • 2020-02-05
  • 2015-08-06
  • 2018-12-18
  • 1970-01-01
相关资源
最近更新 更多