我有一个数据框,其中每个样本的列可以具有多个值,例如:
Gene Pvalue1 Pvalue2 Pvalue3 Beta
Ace 0.0381, ., 0.00357 0.01755, 0.001385 0.0037, NA , 0.039 -0.03,1,15
NOS NA 0.02 0.001, 0.00067 0.00009,25,30
我想申请min()
,并max()
在每列每个基因的(我有成千上万个基因的总数),并得到了p值的最小值但如公测列的最大值。因此,输出数据如下所示:
Gene Pvalue1 Pvalue2 Pvalue3 Beta
Ace 0.00357 0.001385 0.0037 15
NOS NA 0.02 0.00067 30
我是R的新手,不知道我要问的内容是否可能,如果一个单元格中有多个值,它们是否被视为字符串?
使用stringr
和的可能解决方案dplyr
:
library(dplyr)
library(stringr)
getmin = function(col) str_extract_all(col,"[0-9\\.-]+") %>%
lapply(.,function(x) min(as.numeric(x),na.rm = T) ) %>%
unlist()
df %>%
mutate_at(names(df)[-1],getmin)
Gene Pvalue1 Pvalue2 Pvalue3 Beta
1 Ace 0.00357 0.001385 0.00370 -3e-02
2 NOS Inf 0.020000 0.00067 9e-05
Warning messages:
1: In FUN(X[[i]], ...) : NAs introduced by coercion
2: In min(as.numeric(x), na.rm = T) :
no non-missing arguments to min; returning Inf
该函数使用以下命令getmin
提取数字str_extract_all
:
str_extract_all(df$Pvalue2,"[0-9\\.-]+")
[[1]]
[1] "0.01755" "0.001385"
[[2]]
[1] "0.02"
它具有对空格或其他字符不敏感的优点,但只能提取一个点。然后,我遍历此列表以提取每个单元格中的最小值,然后使用将该列表转换为向量unlist
。使用该as.numeric()
函数将可能的提取结果转换.
为NA
。
代码df %>% mutate_at(names(df)[-1],getmin)
只在第一个列以外的所有列上应用此功能
编辑:如果要避免使用inf值,可以使用此稍作修改的版本:
min2 = function(x) if(all(is.na(x))) NA else min(x,na.rm = T)
getmin = function(col) str_extract_all(col,"[0-9\\.-]+") %>%
lapply(.,function(x)min2(as.numeric(x)) ) %>%
unlist()
df %>%
mutate_at(names(df)[-1],getmin)
Gene Pvalue1 Pvalue2 Pvalue3 Beta
1 Ace 0.00357 0.001385 0.00370 -3e-02
2 NOS NA 0.020000 0.00067 9e-05
数据:
df <- read.table(text = "
Gene Pvalue1 Pvalue2 Pvalue3 Beta
Ace 0.0381,.,0.00357 0.01755,0.001385 0.0037,NA,0.039 -0.03,1,15
NOS NA 0.02 0.001,0.00067 0.00009,25,30
",header = T)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句