R 如果数字过去是负数,如何在记录的同时获得绝对值?

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,

我有一个基因数据集,每一行描述一个基因,有一个beta列,其中有多个beta值,我已经从变体级别压缩到一行/细胞中,其中一个基因中的多个变体给出了多个beta。β是基因在一个条件下可能产生的效应大小,因此大的负值和大的正值都很重要。我试图编写代码,从行中选择绝对值,然后尝试创建另一个新列,记录绝对值是否为负值-我有生物学背景,所以我不确定这是否可行,或者最好的方法是什么

例如,我的数据如下所示:

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