使用逻辑运算[R]检查数据集中是否存在之前的值

lokaqttq  于 2023-03-10  发布在  其他
关注(0)|答案(2)|浏览(110)

我有这个数据集

structure(list(N = c("a", "b", "c", "a", "b", "a", "b", "c", 
"a", "c"), S = c("4", "4", "4", "3", "3", "2", "2", "2", "1", 
"1")), class = "data.frame", row.names = c(NA, -10L))

我想通过逻辑运算来验证是否所有的N组都有一个先前的观测值S

library(tidyverse)
df %>% group_by(N) %>% arrange(desc(S)) %>% mutate(L = ifelse(****))

输出应如下所示
| 数量|S型|P级|
| - ------|- ------|- ------|
| 项目a|四个|正确|
| B|四个|正确|
| (c)秘书长的报告|四个|错误|
| 项目a|三个|正确|
| B|三个|正确|
| 项目a|第二章|正确|
| B|第二章|错误|
| (c)秘书长的报告|第二章|正确|
| 项目a|1个|错误|
| (c)秘书长的报告|1个|错误|

vfhzx4xs

vfhzx4xs1#

我们可以使用lead来获得与相邻元素的差,将差转换为逻辑向量(==),按N分组

library(dplyr)# version >= 1.1.0
df %>% 
 type.convert(as.is = TRUE) %>% 
  mutate(P =  (S - lead(S, default = last(S)) == 1), .by = N)
  • 输出
N S     P
1  a 4  TRUE
2  b 4  TRUE
3  c 4 FALSE
4  a 3  TRUE
5  b 3  TRUE
6  a 2  TRUE
7  b 2 FALSE
8  c 2  TRUE
9  a 1 FALSE
10 c 1 FALSE
oiopk7p5

oiopk7p52#

这个怎么样?它在组内按S排序,然后将第一个(S的最小值)标识为FALSE,如果其他值等于S加1的滞后,则将其标识为TRUE

library(dplyr)
dat <- structure(list(N = c("a", "b", "a", "b", "c", "a", "c"), 
                      S = c("4", "3", "2", "2", "2", "1", "1")), class = "data.frame", row.names = c(NA,-7L))

dat %>% 
  mutate(S = as.numeric(S)) %>% 
  group_by(N) %>% 
  arrange(S, .by_group = TRUE) %>% 
  mutate(P= S == (lag(S)+1), 
         P = ifelse(is.na(P), FALSE, P))
#> # A tibble: 7 × 3
#> # Groups:   N [3]
#>   N         S P    
#>   <chr> <dbl> <lgl>
#> 1 a         1 FALSE
#> 2 a         2 TRUE 
#> 3 a         4 FALSE
#> 4 b         2 FALSE
#> 5 b         3 TRUE 
#> 6 c         1 FALSE
#> 7 c         2 TRUE

创建于2023年3月9日,使用reprex v2.0.2

相关问题