我有一个数据框架,其中包含许多独特的个体在很长一段时间内的生存数据(1 =活着,0 =死亡):每个个体(即每行)都有一系列的0和1(每一列代表一个时间段内的生存判断).我现在想判断每个人的时间序列的逻辑,即逻辑将是如果一个人一直活着,或者如果它在途中死亡并保持死亡.不合逻辑的是,如果一个人死了,但在以后的时间点又活了,即它复活了.我想在我的数据框中添加一个新列,显示个人的时间序列是"好"还是"不好".

我可以用dplyr::case_when()来说明所有的可能性,但由于我的时间序列很长,这实际上是不可行的.

有没有一种巧妙的方法(理想情况下使用dplyr,但一切都很好)来测试这种时间序列的逻辑?

请注意,情况并非如此.

# A tibble: 6 × 7
  ind_ID timeperiod_1 timeperiod_2 timeperiod_3 timeperiod_4 timeperiod_5 logic_status
  <chr>  <fct>        <fct>        <fct>        <fct>        <fct>        <chr>       
1 ID_1   1            1            1            1            1            ok          
2 ID_2   1            0            1            0            0            not ok      
3 ID_3   1            1            1            1            1            ok          
4 ID_4   1            1            1            0            0            ok          
5 ID_5   1            0            1            0            0            not ok      
6 ID_6   1            0            1            0            0            not ok    

示例数据:

dput(dat)
structure(list(ind_ID = c("ID_1", "ID_2", "ID_3", "ID_4", "ID_5", 
"ID_6"), timeperiod_1 = structure(c(2L, 2L, 2L, 2L, 2L, 2L), levels = c("0", 
"1"), class = "factor"), timeperiod_2 = structure(c(2L, 1L, 2L, 
2L, 1L, 1L), levels = c("0", "1"), class = "factor"), timeperiod_3 = structure(c(2L, 
2L, 2L, 2L, 2L, 2L), levels = c("0", "1"), class = "factor"), 
    timeperiod_4 = structure(c(2L, 1L, 2L, 1L, 1L, 1L), levels = c("0", 
    "1"), class = "factor"), timeperiod_5 = structure(c(2L, 1L, 
    2L, 1L, 1L, 1L), levels = c("0", "1"), class = "factor")), row.names = c(NA, 
-6L), class = c("tbl_df", "tbl", "data.frame"))

推荐答案

这是c_across的一个很好的用例,当它与rowwise结合使用时,允许您将每行中的多个单元格视为矢量.

因为您的有效/无效列是二进制的,所以可以将它们从因数切换为简单整数.如果每行diff,那么我们将得到指示连续列之间的转换的值向量:A-1,如果某人从活着变为死人,则为+1,如果他们从死人变为活着,则为0;如果他们保持活着,则为or.

唯一不符合逻辑的行是出现一个或多个+1值的行,因此如果该列不符合逻辑,则any(diff(c_across(-1)))将返回TRUE,否则将返回FALSE.为了完整性,我们可以将其放在AN ifelse中,以产生所需的"OK"/"Not OK"输出.

library(tidyverse)

rowwise(dat) %>%
  mutate(across(-1, ~as.numeric(as.character(.x)))) %>%
  mutate(logical = ifelse(any(diff(c_across(-1)) > 0), 'not ok', 'ok')) %>%
  ungroup()
#> # A tibble: 6 x 7
#>   ind_ID timeperiod_1 timeperiod_2 timeperiod_3 timeperiod_4 timeperiod_5 logical
#>   <chr>         <dbl>        <dbl>        <dbl>        <dbl>        <dbl> <chr>  
#> 1 ID_1              1            1            1            1            1 ok     
#> 2 ID_2              1            0            1            0            0 not ok 
#> 3 ID_3              1            1            1            1            1 ok     
#> 4 ID_4              1            1            1            0            0 ok 
#> 5 ID_5              1            0            1            0            0 not ok 
#> 6 ID_6              1            0            1            0            0 not ok

我们可以看到,这正确地将ID 2、5和6标识为"不正常",因为在每一种情况下,它们在时间点2死亡,但在时间点3活着.ID1和ID3被正确地标记为"OK",因为它们自始至终都是活着的,而ID4是"OK",因为他们死后没有复活.

R相关问答推荐

从具有随机模式的字符串中提取值

根据shiny 应用程序中的数字输入更改图标 colored颜色

Tidyverse/Djirr为从嵌套列表中提取的列名赋值的解决方案

从有序数据中随机抽样

MCMC和零事件二元逻辑回归

在发布到PowerBI Service时,是否可以使用R脚本作为PowerBI的数据源?

如果行和大于值,则过滤

用derrr在R中查找组间的重复项

格点中指数、双曲和反双曲模型曲线的正确绘制

gt()从gt为相同内容的单元格 colored颜色 不同?

有没有一个R函数允许你从一个数字变量中提取一个数字,而不考虑它的位置(不仅仅是第一个或最后一个数字?

将嵌套列表子集化为嵌套列表

即使硬币没有被抛出,也要保持对其的跟踪

对于变量的每个值,仅 Select 包含列表中所有值的值.R

如何在R库GoogleDrive中完全删除预先授权的Google帐户?

从R中发出的咕噜声中的BUG?

创建新列,其中S列的值取决于该行S值是否与其他行冗余

将文本批注减少到gglot的y轴上的单个值

如何判断代码是否在R Markdown(RMD)上下文中交互运行?

将`magick`对象转换为原始向量