【问题标题】:How to categorize numerical ranges in r如何对 r 中的数值范围进行分类
【发布时间】:2023-03-24 03:35:01
【问题描述】:

我有一个数据框,其中每一列对应于患者 ID,每一行对应一个特定的基因值。

df <- data.frame(Hugo_Symbol=c("CDKN2A", "JUN", "IRS2","MTOR",
                           "NRAS"),
                  A183=c(-0.19,NA,2.01,0.4,1.23),
                  A185=c(0.11,2.45,NA,NA,1.67),
                  A186=c(1.19,NA,2.41,0.78,1.93),
                  A187=c(2.78,NA,NA,0.7,2.23),
                  A188=c(NA,NA,NA,2.4,1.23))
head(df)

  Hugo_Symbol  A183 A185 A186 A187 A188
1      CDKN2A -0.19 0.11 1.19 2.78   NA
2         JUN    NA 2.45   NA   NA   NA
3        IRS2  2.01   NA 2.41   NA   NA
4        MTOR  0.40   NA 0.78 0.70 2.40
5        NRAS  1.23 1.67 1.93 2.23 1.23

我想为每个值分配以下类别:

  • 如果范围内的值 (-Inf, -2) 分配类别“1”
  • 如果 (-2, 2) 范围内的值指定类别“2”
  • 如果 (2,Inf) 范围内的值指定类别“3”
  • 如果值为 NA,则分配类别“0”

我尝试使用cut 函数来做到这一点。我的代码如下所示:

df2<- df[cut(df,
             breaks=c(-Inf,-2,2,Inf),
             labels=c("1","2","3"))]

但是,我收到以下错误:

cut.default(df, breaks = c(-Inf, -2, 2, Inf), labels = c("1", : “x”必须是数字

我相信这是因为我的表中有 NA 值。我不知道如何为 NA 值分配类别“0”。所需的输出应如下所示:

Hugo_Symbol A183 A185 A186 A187 A188
1      CDKN2A    2    2    2    1    0
2         JUN    0    1    0    0    0
3        IRS2    1    0    1    0    0
4        MTOR    2    0    2    2    1
5        NRAS    2    2    2    1    2

如何修复此错误并将每个值替换为我上面提到的预定义类别?

感谢您的帮助!

欧哈

【问题讨论】:

  • 请在您的问题文本中包含您的数据样本,而不是作为链接。这样做的一个好方法是包含运行dput(df[1:5,1:5]) 的输出,这样我们就有一个很小的 ​​5x5 数据样本可供使用。
  • df 是整个data.frame。它只有一列还是什么?否则,您需要指定要转换的列。而且我不确定您何时使用[] 在此处编制索引。区分转换 data.frame 本身和 data.frame 中的列很重要。但是cut() 是在这里使用的正确函数。
  • 我想转换 data.frame 本身。我为我的桌子添加了一个玩具示例。

标签: r categories


【解决方案1】:

我们可以在base R中使用findInterval

df[-1] <- lapply(df[-1], findInterval, c(-Inf, -2, 2, Inf))

【讨论】:

    【解决方案2】:

    您拥有的代码是正确的,但您需要将其应用于每一列。你可以通过lapply in base R 来做到这一点:

    df[-1] <- lapply(df[-1], cut, c(-Inf,-2,2,Inf), c("1","2","3"))
    df
    
    #  Hugo_Symbol A183 A185 A186 A187 A188
    #1      CDKN2A    2    2    2    3 <NA>
    #2         JUN <NA>    3 <NA> <NA> <NA>
    #3        IRS2    3 <NA>    3 <NA> <NA>
    #4        MTOR    2 <NA>    2    2    3
    #5        NRAS    2    2    2    3    2
    

    或者在dplyr中使用across

    library(dplyr)
    
    df %>% mutate(across(starts_with('A'), cut, c(-Inf,-2,2,Inf),c("1","2","3")))
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 2017-03-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多