【问题标题】:Insert condition (column A value) into function based on a value in a different column (B)根据不同列 (B) 中的值将条件(A 列值)插入函数
【发布时间】:2020-12-10 10:01:50
【问题描述】:

这是对我之前提出的问题 (Replace only certain values in column based on multiple conditions) 的跟进。对于上下文,我包含了一些相同的信息。

我有一个包含许多列的大型数据框,但相关的是:ID(这是分配给受试者的编号)、时间(进行此受试者测量的时间)和浓度。一个非常简单的例子是:

df <- data.frame( ID=c(1,1,1,1,1,2,2,2,2,2,3,3,3,3,3),
                  Concentration=c("XXX",0.3,0.7,0.6,"XXX","XXX",0.8,0.3,"XXX","XXX",
                                  "XXX",0.6,0.1,0.1,"XXX"),
                  Time=c(1,2,3,4,5,1,2,3,4,5,1,2,3,4,5)) 

我想根据以下条件仅替换浓度列中的“XXX”值:

  1. 当Time列的值小于等于timeX时; “XXX”==0

  2. 当Time列的值大于timeX时; “XXX”应替换为单词“Missing”,除非针对 Time>timeX 的单个主题 (ID) 出现两个连续的“XXX”值,然后第一个连续的“XXX”应替换为 0.05并且第二个连续的“XXX”(或所有后续的“XXX”值,如果还有更多)应替换为“Missing”一词。

ID 在这里以某种方式分开非常重要,因为可能有“XXX”作为一个 ID 的最终浓度和作为下一个 ID 的第一个浓度,我不希望将其读取为两个连续的“XXX” " 单个 ID 的值。

当我们假设 timeX=3 时,我的解决方案是:

require(tidyverse)

df <- tibble(df) %>% 
  mutate(Concentration = as.character(Concentration),
         Concentration_Original = Concentration) %>% 
  mutate(Concentration = ifelse(Concentration == 'XXX' & Time <= 3, "0", Concentration)) %>%
  group_by(ID) %>% 
  mutate(Concentration = ifelse(Concentration == 'XXX' & Concentration == lead(Concentration),
                                  "0.05", ifelse(Concentration == 'XXX',
                                                 "Missing", Concentration))) %>% 
  replace_na(list(Concentration = "Missing")) %>% ungroup()

为了使代码更灵活,更重要的是它不需要用户手动检查时间截止点应该是什么然后手动插入,我一直在尝试使代码更自动化。

我想将 Time timeX 的以下条件: timeX 是时间列中的值对于那个特定的主题 ID,在该列集中的值是最高的。所以基本上条件应该是 timeX 是浓度达到最大值的那个。 例如:对于我的 df 中的 ID 1,最高浓度为 0.7,并且该浓度在 Time = 3 时达到,因此值 3 应插入为 timeX 值。

【问题讨论】:

    标签: r tidyverse tibble


    【解决方案1】:

    以下是一些可能有用的想法/建议。

    首先,如果您想查看Concentration 的最大值,我不会将此列设为字符类型。相反,会将其设为数字​​,并使用 NA 表示缺失值。第一个 mutate 设置了它。

    分组后,您可以使用mutatecase_when 来满足您的各种情况。您可以通过以下方式访问最大注意力的Time

    Time[which(Concentration == max(Concentration, na.rm = TRUE))]
    

    (删除缺失值)。

    如果缺少Concentration,并且Time小于最大浓度Time,则改为0。

    在第二种情况下,如果lead(或后续行)也缺失,则更改为 .05。

    否则,请勿更改Concentration

    根据进一步的分析和展示,您可以使用“Missing”作为缺失数据的文本标签。

    编辑:根据OP评论,似乎只有在最大时间之后的第一个“XXX”应替换为0.05以集中注意力,但以下所有“ XXX”之后就被视为失踪。为此,请添加:

    !is.na(lag(Concentration, default = 0))
    

    作为确定值是否应为 0.05 的条件。逻辑是:如果上一行的值不是NA,但后面的值NA,经过最大时间后,变为0.05。

    这是修改后的代码:

    library(tidyverse)
    
    df %>%
      mutate(Concentration = ifelse(Concentration == "XXX", NA_character_, Concentration),
             Concentration = as.numeric(Concentration)) %>%
      group_by(ID) %>%
      mutate(Concentration_New = case_when(
        is.na(Concentration) & Time < first(Time[which(Concentration == max(Concentration, na.rm = TRUE))]) ~ 0,
        is.na(Concentration) & Time > last(Time[which(Concentration == max(Concentration, na.rm = TRUE))]) & 
          is.na(lead(Concentration, default = 0)) & !is.na(lag(Concentration, default = 0)) ~ .05,
        TRUE ~ Concentration
      ))
    

    输出

          ID Concentration  Time Concentration_New
       <dbl>         <dbl> <dbl>             <dbl>
     1     1          NA       1              0   
     2     1           0.3     2              0.3 
     3     1           0.7     3              0.7 
     4     1           0.6     4              0.6 
     5     1          NA       5             NA   
     6     2          NA       1              0   
     7     2           0.8     2              0.8 
     8     2           0.3     3              0.3 
     9     2          NA       4              0.05
    10     2          NA       5             NA   
    11     3          NA       1              0   
    12     3           0.6     2              0.6 
    13     3           0.1     3              0.1 
    14     3           0.1     4              0.1 
    15     3          NA       5             NA   
    

    【讨论】:

      猜你喜欢
      • 2022-07-04
      • 2015-05-12
      • 1970-01-01
      • 1970-01-01
      • 2018-08-06
      • 1970-01-01
      • 2018-11-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多