如何对 r 中的数值范围进行分类
How to categorize numerical ranges in r
我有一个数据框,其中每一列对应于 patientID,每一行对应于一个特定的基因值。
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' must be numeric
我相信这是因为我的 table 中有 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
如何修复此错误并将每个值替换为我上面提到的预定义类别?
感谢您的帮助!
奥尔哈
您的代码是正确的,但您需要将它应用到每一列。您可以通过基础 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")))
我们可以在base R
中使用findInterval
df[-1] <- lapply(df[-1], findInterval, c(-Inf, -2, 2, Inf))
我有一个数据框,其中每一列对应于 patientID,每一行对应于一个特定的基因值。
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' must be numeric
我相信这是因为我的 table 中有 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
如何修复此错误并将每个值替换为我上面提到的预定义类别?
感谢您的帮助!
奥尔哈
您的代码是正确的,但您需要将它应用到每一列。您可以通过基础 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")))
我们可以在base R
findInterval
df[-1] <- lapply(df[-1], findInterval, c(-Inf, -2, 2, Inf))