gpt4 book ai didi

r - 重复跟随父 ID 直到祖先的 Tidyverse 方法

转载 作者:行者123 更新时间:2023-12-01 22:47:51 24 4
gpt4 key购买 nike

The themes dataset from Rebrickable包括每个主题的 ID 及其父 ID(列已在此处重命名),这可能会递归(ID 可能有祖 parent 、曾祖 parent 等)这是一个遵循父链 City -> Advent -> Seasonal 的示例:

themes <- data.frame(theme_id = c(206, 207, 208), 
theme_name = c("Seasonal", "Advent", "City"),
parent_theme_id = c(NA, 206, 207))

这是我的基本 R 代码,用于跟踪父 ID 直到达到 NA,这意味着没有父 ID:

for (i in 1:nrow(themes)) {
orig_id <- themes[i,]$theme_id
cur_id <- orig_id
repeat {
par_id <- themes[themes$theme_id == cur_id,]$parent_theme_id
if (is.na(par_id)) break
cur_id <- par_id
}

themes[themes$theme_id == orig_id,]$ancestor_theme_id = cur_id
}

是否有更好的 tidyverse 或基本 R 方法来创建包含最大祖先 ID 的新列?我想不出一种递归地遵循 ID“指针”而不一次操作一行并且在某处有循环的好方法。

最佳答案

正如@r2evans 在评论中解释的那样,递归查找本身没有 tidyverse 函数,但是您可以通过定义递归函数并从 mutate 调用它来使您的代码更加简洁和 tidyverse-y (map_dbl()):

library(dplyr)
library(purrr)

find_ancestor <- function(id) {
dat <- cur_data()
parent <- filter(dat, theme_id == id)$parent_theme_id
if (is.na(parent)) id else find_ancestor(parent)
}

themes %>%
mutate(ancestor_theme_id = map_dbl(theme_id, find_ancestor))
  theme_id theme_name parent_theme_id ancestor_theme_id
1 206 Seasonal NA 206
2 207 Advent 206 206
3 208 City 207 206

关于r - 重复跟随父 ID 直到祖先的 Tidyverse 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/74965752/

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