使用dplyr:在组中,选择满足条件的第一个值

托德·D

我需要协助,以获取将及时向后扫描并获得满足条件的第一个值的解决方案。我有类似的数据:

set.seed(42)

df <- data.frame(
  id = sample(LETTERS[1:3], 20, replace = TRUE),
  time.var = sample(1:20, 20, replace = TRUE),
  x = sample(c(1:10), 20, replace = TRUE)
  )

df <- df[order(df$id, df$time.var),]

 id time.var  x
  A        5  2
  A       14  8
  A       19  7
  A       20  1
  B        1  1
  B        2  5
  B        9 10
  B       11 10
  B       13  6
  B       15  4
  B       19  3
  C        1  7
  C        3  5
  C        8  9
  C        8  4
  C       17  7
  C       17  4
  C       17  8
  C       19  4
  C       19 10

对于按时间顺序定义的每个组的最后一个成员time.var,我想x通过按降序扫描从小于5的值中获取第一个值

我试过了:

test <- df %>% 
        group_by(id) %>% 
        arrange(id, time.var) %>% 
        mutate(less.5 = which.max(x[x < 5]) )

我可以使用什么策略来获得这种类型的输出:

 id time.var  x  previous.less.5
  A        5  2
  A       14  8
  A       19  7
  A       20  1      2
  B        1  1
  B        2  5
  B        9 10
  B       11 10
  B       13  6
  B       15  4
  B       19  3      4
  C        1  7
  C        3  5
  C        8  9
  C        8  4
  C       17  7
  C       17  4
  C       17  8
  C       19  4
  C       19 10      4
M--

使用library(dplyr)

df %>% 
  arrange(id, time.var) %>% 
  group_by(id) %>% 
  mutate(previous.less.5 = tail(c(x[c((x[-n()] < 5), FALSE)]),1)) %>% 
  group_by(id) %>% 
  mutate(previous.less.5 = if_else(row_number() == n(), previous.less.5, NULL))

要么

df %>%
  arrange(id, time.var) %>% 
  group_by(id) %>%   
  slice(1:(n()-1)) %>% 
  filter(x < 5) %>% 
  slice(n()) %>% 
  select(-time.var) %>% 
  right_join(df, ., by="id", suffix =c("",".y")) %>% 
  group_by(id) %>% 
  mutate(previous.less.5 = if_else(row_number() == n(), x.y, NULL)) %>%
  select(-x.y)

给予:

#> # A tibble: 20 x 4
#> # Groups:   id [3]
#>    id    time.var     x previous.less.5
#>    <fct>    <int> <int>           <int>
#>  1 A            3    10              NA
#>  2 A            4     8              NA
#>  3 A            4     6              NA
#>  4 A            5     2              NA
#>  5 A            5     8              NA
#>  6 A            5     7              NA
#>  7 A           11     6              NA
#>  8 A           13     3              NA
#>  9 A           15     2               3
#> 10 B            2     1              NA
#> 11 B            4     3              NA
#> 12 B            4     6              NA
#> 13 B            8     5              NA
#> 14 B            8     4              NA
#> 15 B           20     7               4
#> 16 C            1     2              NA
#> 17 C            2    10              NA
#> 18 C           10     6              NA
#> 19 C           13     2              NA
#> 20 C           18     5               2

更新:

如果某个组的记录不小于5(或最后一个记录小于5),则可以进行以下操作:

df %>% 
  arrange(id, time.var) %>% 
  group_by(id) %>% 
  mutate(previous.less.5 = if_else(row_number() == n(), 
                                   max(tail(c( x[ c( x[-n()] < 5, FALSE) ] ), 1)), 
                                   NULL)) %>% 
  mutate(previous.less.5 = replace(previous.less.5, is.infinite(previous.less.5), NA))

数据:

set.seed(42) # I am getting different data than what you've shown with this seed

df <- data.frame(
  id = sample(LETTERS[1:3], 20, replace = TRUE),
  time.var = sample(1:20, 20, replace = TRUE),
  x = sample(c(1:10), 20, replace = TRUE)
)

df <- df[order(df$id, df$time.var),]

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何找到满足条件的组中的第一个元素

dplyr:将组中的所有值除以组的第一个值

使用同一组中满足条件的下一个第一行设置列值

返回第一个满足条件的数组中的值

如何更改满足特定条件的数据框中的第一个值

如何在R中使用groupby获取满足条件的列的第一个值?

根据组中第一个值的条件替换 df 中的后续值

如何使用r中“下一个”组的第一个值?

使用RLE从组中获取第一个和最后一个值

如果/否则:仅在R中不满足第一个条件后,才在设置的距离内选择第一个匹配记录

如何选择组中的第一个值-不进行过滤?

如何并行运行任务并选择满足C#中给定条件的第一个结果?

R dplyr窗口函数,获取下一个满足某些条件的x窗口中的第一个值

第一个选择中的第一个选择的mySQL使用结果

如何使用jQuery选择每个组中的第一个元素?

比较两个列表并在条件满足后获得第一个值

在满足熊猫数据帧中条件的数据帧位置处返回第一个值的位置

有效地返回数组中第一个值满足条件的索引

是否有内置的Django模板过滤器来查找列表中满足条件的第一个值?

使用条件获取第一个值

如何确定 First 的使用范围以仅获取组中的第一个值?

Haskell地图,直到满足第一个条件

获取满足条件的第一个对象

如何使用 dplyr 在 R 中查找具有第一个值的列?

Python Pandas - 获取满足条件的第一个值

创建一个新变量,仅当 R 中满足条件时才打印一系列列中的第一个值

dplyr:case_when在满足第一个条件后具有多个子字符串条件

如果条件匹配,则选择MySql值;如果不匹配,则选择第一个值

If语句是否会停止检查PHP中是否满足第一个OR条件?