如何在R中对数值范围进行分类

3

我有一个数据框,其中每一列对应患者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"))]

然而,我收到了以下错误:

Error in 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

我该如何修复这个错误并将每个值替换为我上面提到的预定义类别?
谢谢您的帮助!
Olha

2
请在问题的文本中包含数据样本,而不是链接。一个好的方法是包括运行 dput(df[1:5,1:5]) 的输出,这样我们就有了一个小的 5x5 数据样本来处理。 - Jon Spring
df 是整个数据框。它只有一列还是什么?否则,您需要指定要转换的列。我不确定您在此处使用 [] 进行索引的时候。区分转换数据框本身和数据框中的列非常重要。但是,在这里使用 cut() 是正确的函数。 - MrFlick
我想要转换数据框本身。我已经为我的表格添加了一个玩具示例。 - Olha Kholod
2个回答

2

你的代码是正确的,但需要对每个列应用它。你可以通过基本的R中的lapply来实现:

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")))

2
我们可以在 base R 中使用 findInterval
df[-1] <- lapply(df[-1], findInterval, c(-Inf, -2, 2, Inf))

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接