首页 > 解决方案 > 对成对列应用条件

问题描述

假设有以下情况:

    Statistic1       Condition1     Statistic2       Condition2         
      0.00001            Y             0.02              NA      
      0.03               Y             0.0001            NA         
      0.01               NA            0.001              Y       
     ..............

总共 20.000 行和 60 列。假设如果相对 Statistic* 列中的值 <0.05,您希望将“Condition*”列中的 NA/Y 替换为 0。检查将涉及配对列 Statistic*-Condition*。怎么可能在大量的列和行上做到这一点?

先感谢您

标签: r

解决方案


一种tidyverse可能是:

df %>%
 mutate_at(vars(matches("Condition")), list(~ (. = 1))) %>%
 rowid_to_column() %>%
 gather(var, val, -rowid) %>%
 arrange(rowid) %>%
 group_by(rowid, pair = parse_number(var)) %>%
 mutate(val = (lag(val, default = 0) < 0.05) * val) %>%
 ungroup() %>%
 select(-pair) %>%
 spread(var, val) %>%
 select(-rowid)

  Condition1 Condition2 Statistic1 Statistic2
       <dbl>      <dbl>      <dbl>      <dbl>
1          1          0    0.00001     1     
2          1          1    0.03        0.0001
3          1          1    0.01        0.001 

在这里,它首先将 1 分配给所有“条件”列并创建一个行 ID。其次,它执行从宽到长的数据转换,不包括行 ID。第三,它根据行ID排列数据,并按行ID和由列中的数字组成的对来分组。第四,检查统计量是否小于 0.05。最后,它将数据返回到其原始格式并删除冗余变量。

我使用了这个示例数据,在其中添加了一个统计量等于 1 的案例:

df <- read.table(text = "Statistic1       Condition1     Statistic2       Condition2         
0.00001            Y             1              NA      
0.03               Y             0.0001            NA         
0.01               NA            0.001              Y", 
                 header = TRUE,
                 stringsAsFactors = FALSE)

推荐阅读