R 如果数字过去是负数,如何在记录的同时获得绝对值?
我有一个基因数据集,每一行描述一个基因,有一个beta列,其中有多个beta值,我已经从变体级别压缩到一行/细胞中,其中一个基因中的多个变体给出了多个beta。β是基因在一个条件下可能产生的效应大小,因此大的负值和大的正值都很重要。我试图编写代码,从行中选择绝对值,然后尝试创建另一个新列,记录绝对值是否为负值-我有生物学背景,所以我不确定这是否可行,或者最好的方法是什么 例如,我的数据如下所示:R 如果数字过去是负数,如何在记录的同时获得绝对值?,r,dplyr,bioinformatics,absolute-value,R,Dplyr,Bioinformatics,Absolute Value,我有一个基因数据集,每一行描述一个基因,有一个beta列,其中有多个beta值,我已经从变体级别压缩到一行/细胞中,其中一个基因中的多个变体给出了多个beta。β是基因在一个条件下可能产生的效应大小,因此大的负值和大的正值都很重要。我试图编写代码,从行中选择绝对值,然后尝试创建另一个新列,记录绝对值是否为负值-我有生物学背景,所以我不确定这是否可行,或者最好的方法是什么 例如,我的数据如下所示: Gene Beta ACE 0.01, -0.6, 0.4 BRCA 0.7,
Gene Beta
ACE 0.01, -0.6, 0.4
BRCA 0.7, -0.2, 0.2
ZAP70 NA
P53 0.8, -0.6, 0.001
预期输出如下所示:选择绝对值并跟踪哪些数字为负数:
Gene Beta Negatives
ACE 0.6 1
BRCA 0.7 0
ZAP70 NA NA
P53 0.8 0
我目前一直在从每一行获取绝对值,我尝试的是:
abs2 = function(x) if(all(is.na(x))) NA else abs(x,na.rm = T)
getabs = function(col) str_extract_all(col,"[0-9\\.-]+") %>%
lapply(.,function(x)abs2(as.numeric(x)) ) %>%
unlist()
test <- df %>%
mutate_at(names(df)[2],getabs)
#Outputs:
Error in abs(x, na.rm = T) : 2 arguments passed to 'abs' which requires 1
您可以简单地拆分、转换为数字、查找绝对最大值的索引并检查其是否为负值,即
sapply(strsplit(df$Beta, ', '), function(i){i1 <- as.numeric(i);
i2 <- which.max(abs(i1));
if (length(i2) == 0){NA}else{i[i2] < 0}}) * 1
#[1] 1 0 NA 0
您可以简单地拆分、转换为数字、查找绝对最大值的索引并检查其是否为负值,即
sapply(strsplit(df$Beta, ', '), function(i){i1 <- as.numeric(i);
i2 <- which.max(abs(i1));
if (length(i2) == 0){NA}else{i[i2] < 0}}) * 1
#[1] 1 0 NA 0
使用dplyr的一种方法是将逗号分隔的值分成单独的行,按基因分组,得到Beta的最大绝对值,并检查该值是否为负值
library(dplyr)
df %>%
tidyr::separate_rows(Beta, sep = ",", convert = TRUE) %>%
group_by(Gene) %>%
summarise(Negatives = +(min(Beta) == -max(abs(Beta))),
Beta = max(abs(Beta), na.rm = TRUE))
# A tibble: 4 x 3
# Gene Negatives Beta
# <fct> <int> <dbl>
#1 ACE 1 0.6
#2 BRCA 0 0.7
#3 P53 0 0.8
#4 ZAP70 NA -Inf
资料
使用dplyr的一种方法是将逗号分隔的值分成单独的行,按基因分组,得到Beta的最大绝对值,并检查该值是否为负值
library(dplyr)
df %>%
tidyr::separate_rows(Beta, sep = ",", convert = TRUE) %>%
group_by(Gene) %>%
summarise(Negatives = +(min(Beta) == -max(abs(Beta))),
Beta = max(abs(Beta), na.rm = TRUE))
# A tibble: 4 x 3
# Gene Negatives Beta
# <fct> <int> <dbl>
#1 ACE 1 0.6
#2 BRCA 0 0.7
#3 P53 0 0.8
#4 ZAP70 NA -Inf
资料
您可以编写自定义函数f并通过矢量化将其矢量化,即
您可以编写自定义函数f并通过矢量化将其矢量化,即
为了澄清,您想从每行中包含的所有值中选择最大的绝对值?以及记录与此最大值对应的原始值是正值还是负值。是的,确切地说,此相关帖子:很高兴添加有关您试图实现的目标的详细信息。你是想找到基因中最重要的变异,还是想给基因分配最高的β?这在统计上有意义吗?是否有一个原因不能通过简单地使用两列来解决,一列表示值,一列表示绝对值?只是为了澄清一下,您想从每行中包含的所有值中选择最大的绝对值?以及记录与此最大值对应的原始值是正值还是负值。是的,确切地说,此相关帖子:很高兴添加有关您试图实现的目标的详细信息。你是想找到基因中最重要的变异,还是想给基因分配最高的β?这在统计学上有意义吗?有没有一个原因不能简单地用两列来解决,一列表示值,一列表示绝对值?
f <- Vectorize(function(x) {
v <- as.numeric(unlist(strsplit(as.character(x),split = ",")))
c(Beta = max(abs(v)),Negatives = sum(v<0 & v==-max(abs(v))))
})
df <- cbind(df[1],t(f(df$Beta)))
> df
Gene Beta Negatives
1 ACE 0.6 1
2 BRCA 0.7 0
3 ZAP70 NA NA
4 P53 0.8 0