gpt4 book ai didi

r - 迭代地分层循环行,直到满足条件

转载 作者:行者123 更新时间:2023-12-02 09:04:33 25 4
gpt4 key购买 nike

我正在尝试解决 R 中的数据管理问题。

假设我的数据如下:

id <- c("123", "414", "606")
next.up <- c("414", "606", "119")
is.cond.met <- as.factor(c("FALSE", "FALSE", "TRUE"))
df <- data.frame(id, next.up, is.cond.met)

> df
id next.up is.cond.met
1 123 414 FALSE
2 414 606 FALSE
3 606 119 TRUE


我想获得以下内容:

id <- c("123", "414", "606")
next.up <- c("414", "606", "119")
is.cond.met <- as.factor(c("FALSE", "FALSE", "TRUE"))
origin <- c("606", "606", "119")
df.result <- data.frame(id, next.up, is.cond.met, origin)

> df.result
id next.up is.cond.met origin
1 123 414 FALSE 606
2 414 606 FALSE 606
3 606 119 TRUE 119


换句话说:当给定条件 (is.met) 为真时,我希望将每个 ID 与其“来源”匹配。我遇到的困难是,这是迭代和分层的:为了找到原点,我可能必须经历多个程度的分离。逻辑步骤如下所示。我真的不知道如何在 R 中解决这个问题。

logical steps


更新
其中一条评论提出了一种适用于排序数据的 data.frame 解决方案,如上面的最小示例所示。事实上,我的数据并不是以这种方式排序的。一个更好的例子如下:

id <- c("961980", "14788", "902460", "900748", "728912", "141726", "1041190", "692268")
next.up <- c("20090", "655036", "40375164", "40031850", "40368996", "961980", "141726", "760112")
is.cond.met <- c(TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE)
df <- data.frame(id, next.up, is.cond.met, stringsAsFactors = FALSE)

glimpse(df)

Observations: 8
Variables: 3
$ id <chr> "961980", "14788", "902460", "900748", "728912", "141726", "1041190", "692268"
$ next.up <chr> "20090", "655036", "40375164", "40031850", "40368996", "961980", "141726", "760112"
$ is.cond.met <lgl> TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE
> df
id next.up is.cond.met
1 961980 20090 TRUE
2 14788 655036 FALSE
3 902460 40375164 FALSE
4 900748 40031850 FALSE
5 728912 40368996 FALSE
6 141726 961980 FALSE
7 1041190 141726 FALSE
8 692268 760112 FALSE


更新 2:最终结果应如下所示:

> df.end.result
id next.up is.cond.met origin
1 961980 20090 TRUE <NA>
2 14788 655036 FALSE <NA>
3 902460 40375164 FALSE <NA>
4 900748 40031850 FALSE <NA>
5 728912 40368996 FALSE <NA>
6 141726 961980 FALSE 961980
7 1041190 141726 FALSE 961980
8 692268 760112 FALSE <NA>

最佳答案

我对您的示例数据进行了一些扩展,以展示 is.cond.met 中更多 TRUE 值会发生什么情况。使用data.table包,你可以这样做:

library(data.table)
setDT(df)[, grp := shift(cumsum(is.cond.met), fill=0)
][, origin := ifelse(is.cond.met, next.up, id[.N]), by = grp][]

给出:

> df
id next.up is.cond.met grp origin
1: 123 414 FALSE 0 606
2: 414 606 FALSE 0 606
3: 606 119 TRUE 0 119
4: 119 321 FALSE 1 321
5: 321 507 TRUE 1 507
6: 507 185 TRUE 2 185

说明:

  1. 首先使用 shift(cumsum(is.cond.met), fill=0) 创建分组变量
  2. 使用 ifelse(is.cond.met, next.up, id[.N]),您可以为 origin 分配正确的值。

注意: idnext.up 列应该是类字符,以上内容才能工作(因此我使用 stringsAsFactors = FALSE 构建扩展示例数据)。如果它们是因子,请先使用 as.character 进行转换。如果 is.cond.met 还不是逻辑,请使用 as.ological 进行转换。

<小时/>

在更新的示例数据上,上面的代码给出:

        id  next.up is.cond.met grp origin
1: 961980 20090 TRUE 0 20090
2: 14788 655036 FALSE 1 692268
3: 902460 40375164 FALSE 1 692268
4: 900748 40031850 FALSE 1 692268
5: 728912 40368996 FALSE 1 692268
6: 141726 961980 FALSE 1 692268
7: 1041190 141726 FALSE 1 692268
8: 692268 760112 FALSE 1 692268
<小时/>

使用的数据:

id <- c("123", "414", "606", "119", "321", "507")
next.up <- c("414", "606", "119", "321", "507", "185")
is.cond.met <- c(FALSE, FALSE, TRUE, FALSE, TRUE, TRUE)

df <- data.frame(id, next.up, is.cond.met, stringsAsFactors = FALSE)

关于r - 迭代地分层循环行,直到满足条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38358128/

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