【问题标题】:How to code multiple columns of character variables into 0,1,2 based on their frequency如何根据频率将多列字符变量编码为0、1、2
【发布时间】:2020-08-31 19:45:59
【问题描述】:

我现在正在处理遗传数据,并试图将遗传数据(分类数据)编码为数字 0、1、2。简化的数据集如下所示。

患者 ID 基因 1 基因 2 基因 3

  1.     C/G   A/G   G/A  
    
  2.     C/C   A/A   G/G
    
  3.     C/C   A/A   A/A
    
  4.     G/G   G/G   G/G
    

每列总是有三个级别,格式为 A/A、A/B 和 B/B。但是,不能确定 A 或 B 是每列 N 中的主要字母。例如,在 Gene1 列中,C 比 G 多,表示 C 是大写字母。我希望 C/C(两个大写字母)编码为 0,G/G(两个小写字母)编码为 2,C/G 或 G/C(一个大写字母 + 一个小写字母)编码为 1。同样,在 Gene3 列中,G 是最常见的字母,因此,我希望将 G/G 编码为 0,并将 A/A 编码为 2。像 A/B 这样具有两个不同字母的列始终编码为 1。

我希望输出清理后的数据集如下所示:

患者 ID 基因 1 基因 2 基因 3

  1.     1     1     1  
    
  2.     0     0     0
    
  3.     0     0     2
    
  4.     2     2     0
    

我有超过 750 列这样的列,因此无法逐列手动对其进行编码。无论如何,我可以同时对超过 750 列这样的遗传数据进行编码。我已经在这一步停留了将近两天,感谢您提供任何帮助。 python和r代码都可以。

谢谢!

【问题讨论】:

    标签: python r data-science data-cleaning


    【解决方案1】:

    一个dplyr 选项可能是:

    df %>%
     mutate(across(everything(), ~ case_when(. == names(which.max(table(.))) ~ 0,
                                             substr(., 1, 1) == substr(., 3, 3) ~ 2,
                                             TRUE ~ 1)))
    
      Gene1 Gene2 Gene3
    1     1     1     1
    2     0     0     0
    3     0     0     2
    4     2     2     0
    

    【讨论】:

    • 感谢这完美的作品。抱歉我的帖子格式不好,我对这个论坛还是很陌生:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多