gpt4 book ai didi

r - 检查组 R 中的任何前一行是否满足条件

转载 作者:行者123 更新时间:2023-12-05 05:46:31 29 4
gpt4 key购买 nike

假设我在 R 中有这个数据框:

x <-data.frame(group=c("A","A","A", "B","B", "C","C","C"), cond=c("g1", "g2", "g1", "g3", "g2",  "g2", "g1", "g2"), order=c(1,2,3,2,1,2,3,1))
group cond order
A g1 1
A g2 2
A g1 3
B g3 2
B g2 1
C g2 2
C g1 3
C g2 1

我希望根据顺序变量对组进行排序以生成两个变量:v1) yes/no whether cond=="g1"for any of the previous rows in a group, v2) yes/no whether, for a given行,组中有前一行具有不同的 cond 值(v2=no,当 group=C 和 order=1 或 2,但 v2=yes,当 group=C 和 order=3)。我知道我可以使用 dplyr 来安排组:

x %>% group_by(group) %>% arrange(order, .by_group=T)

但我不知道从那里去哪里,因为 lag()lead() 仅适用于紧邻之前或之后的行。

最佳答案

  1. 生成 one-hot codes对于 cond。 (为此我使用了 pivot_wider。)
  2. cond 代码的累计和 > 0 时,表示该值已出现在当前或前一行中。我们可以使用 dplyr::lag 排除当前行。
  3. 对 one-hot 代码求和告诉我们到目前为止已经看到了多少个独特的 cond 值。如果大于 1,则我们知道前一行的值一定与当前行的值不同。
  4. 通过选择清除单热代码和其他帮助列来进行清理。
library(dplyr)
library(tidyr)

x <-data.frame(
group=c("A","A","A", "B","B", "C","C","C"),
cond=c("g1", "g2", "g1", "g3", "g2", "g2", "g1", "g2"),
order=c(1,2,3,2,1,2,3,1)
)

x2 <- x %>%
mutate(cond_pivot = cond, cond_value = 1) %>%
pivot_wider(
names_from = cond_pivot,
values_from = cond_value,
values_fill = 0
) %>%
group_by(group) %>%
arrange(order, .by_group = TRUE) %>%
mutate(
across(g1:g3, ~ cumsum(.x) > 0, .names = "{.col}_seen_yet"),
n_seen_so_far = rowSums(across(g1_seen_yet:g3_seen_yet)),
v1 = dplyr::lag(g1_seen_yet, default = FALSE),
v2 = n_seen_so_far > 1
) %>%
select(group:order, v1:v2)

输出:

# A tibble: 8 x 5
# Groups: group [3]
group cond order v1 v2
<chr> <chr> <dbl> <lgl> <lgl>
1 A g1 1 FALSE FALSE
2 A g2 2 TRUE TRUE
3 A g1 3 TRUE TRUE
4 B g2 1 FALSE FALSE
5 B g3 2 FALSE TRUE
6 C g2 1 FALSE FALSE
7 C g2 2 FALSE FALSE
8 C g1 3 FALSE TRUE

关于r - 检查组 R 中的任何前一行是否满足条件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71165855/

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