gpt4 book ai didi

r - 当在另一行中发现元素逗号分隔时合并行

转载 作者:行者123 更新时间:2023-12-04 13:28:46 24 4
gpt4 key购买 nike

您好,我有一个数据框,例如:

  species family    Events      groups
1 SP1 A 10,22 G1
2 SP1 B 7 G2
3 SP1 C,D 4,5,6,1,3 G3,G4,G5,G6
4 SP2 A 22,10 G1
5 SP2 D,C 6,5,4,3,1 G4,G6,G5,G3
6 SP3 C 4,5,3,6,1 G3,G6,G5
7 SP3 E 7 G2
8 SP3 A 10 G1
9 SP4 C 7,22 G12
我想简单地为每列中至少有一个重复元素的每个合并行(除了 species )。
例如,我将合并行:
species family    Events      groups
SP1 A 10,22 G1
species family Events groups
SP2 A 22,10 G1
species family Events groups
SP3 A 10 G1
进入
species      family    Events      groups
SP1,SP2,SP3 A 10,22 G1
所以如果我对每一行都做同样的事情,我应该得到一个预期的输出:
species      family    Events      groups
SP1,SP2,SP3 A 10,22 G1
SP1,SP3 B,E 7 G2
SP1,SP2,SP3 C,D 1,3,4,5,6 G3,G4,G6,G5
SP4 C 7,22 G12
请注意,SP4 尚未与任何行合并,因为它的组不存在于任何其他行中。
有人有想法吗?
非常感谢您的帮助和时间
如果有帮助,这是数据框:
structure(list(species = structure(c(1L, 1L, 1L, 2L, 2L, 3L, 
3L, 3L, 4L), .Label = c("SP1", "SP2", "SP3", "SP4"), class = "factor"),
family = structure(c(1L, 2L, 4L, 1L, 5L, 3L, 6L, 1L, 3L), .Label = c("A",
"B", "C", "C,D", "D,C", "E"), class = "factor"), Events = structure(c(2L,
7L, 5L, 3L, 6L, 4L, 7L, 1L, 8L), .Label = c("10", "10,22",
"22,10", "4,5,3,6,1", "4,5,6,1,3", "6,5,4,3,1", "7", "7,22"
), class = "factor"), groups = structure(c(1L, 3L, 4L, 1L,
6L, 5L, 3L, 1L, 2L), .Label = c("G1", "G12", "G2", "G3,G4,G5,G6",
"G3,G6,G5", "G4,G6,G5,G3"), class = "factor")), class = "data.frame", row.names = c(NA,
-9L))
我可以做什么和尝试:
到目前为止,我只知道如何使用 dplyr 中的类似内容合并具有精确重复值的行:
desired_df <- df %>%
group_by_at(vars(-species)) %>%
summarize(species = toString(species)) %>%
ungroup() %>%
select(names(df))
但在这里我们没有精确的重复值,而是我在 comma 之间寻找可以出现在另一行中。

最佳答案

这是一个完整的解决方案(调用输入数据框 dat )。
请注意,此解决方案与您提供的所需输出不同。 这是因为您指出规则是“合并每列至少有一个重复元素的行,物种除外。”根据该规则,第 2 行和第 7 行不应合并,因为它们共享没有 family共同点。
首先,将我们要测试重叠值的三列转换为列表列。现在这些列的每个元素都是一个列表。我也胁迫了Events列转换为数字,以便正确排序。

library(tidyverse)

dat <- dat %>%
mutate(across(c(family, Events, groups), ~ strsplit(as.character(.), split = ','))) %>%
mutate(Events = map(Events, as.numeric))
接下来,定义一个函数来折叠数据框的每一行。该函数接受参数 i这是一个行索引。在函数中,我们做了两件事:
  • 首先我们使用 pmap_lgl遍历数据框的每一行以检查所有三列中的哪些行family , Events , 和 groups与行 i 至少有一个共享值因此应该被折叠。例如,如果 i==1这将返回 TRUE对于第 1、4 和 8 行。
  • 接下来,我们过滤dat仅适用于返回 TRUE 的那些行,并将函数应用于这些行的所有列。该函数将这些行中的所有列折叠为已排序唯一值的逗号分隔字符串。
  • collapse_rows <- function(i) {
    rows_collapse <- pmap_lgl(dat, function(family, Events, groups, ...)
    any(dat$family[[i]] %in% family) & any(dat$Events[[i]] %in% Events) & any(dat$groups[[i]] %in% groups))
    dat %>%
    filter(rows_collapse) %>%
    mutate(across(everything(), ~ paste(sort(unique(unlist(.))), collapse = ',')))
    }
    最后,我们将此函数应用于每个行索引。我们最终得到重复的行,例如初始输出的第 1、4 和 8 行将是相同的。我们使用 distinct删除所有这些重复项。
    dat_collapse <- map_dfr(1:nrow(dat), collapse_rows) %>% distinct
    最终输出:
         species family    Events      groups
    1 SP1,SP2,SP3 A 10,22 G1
    2 SP1 B 7 G2
    3 SP1,SP2,SP3 C,D 1,3,4,5,6 G3,G4,G5,G6
    4 SP3 E 7 G2
    5 SP4 C 7,22 G12

    关于r - 当在另一行中发现元素逗号分隔时合并行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66475914/

    24 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com