首页 文章

dplyr计算涉及两列数据帧(R)

提问于
浏览
0

我对R很新,在广泛搜索网页后无法找到我的问题 . 我正在尝试使用dplyr函数来执行以下任务:

我有以下data.frame作为tibble:以 X. 开头的列表示不同的样本,行表示特定基因的表达量 .

head(immgen_dat)
# A tibble: 6 x 212
  ProbeSetID GeneName  Description         X.proB_CLP_BM. X.proB_CLP_FL. X.proB_FrA_BM. X.proB_FrA_FL. X.proB_FrBC_BM.
       <int> <fct>     <fct>                        <dbl>          <dbl>          <dbl>          <dbl>           <dbl>
1   10344620 " Gm1056~ " predicted gene 1~           15.6           15.3           17.2           16.1            18.1
2   10344622 " Gm1056~ " predicted gene 1~          240.           255.           224.           312.            272. 
3   10344624 " Lypla1" " lysophospholipas~          421.           474.           349.           478.            459. 
4   10344633 " Tcea1"  " transcription el~          802.           950.           864.           968.           1056. 
5   10344637 " Atp6v1~ " ATPase H+ transp~          199.           262.           167.           267.            255. 
6   10344653 " Oprk1"  " opioid receptor ~           14.8           12.8           18.0           13.2            15.3
# ... with 204 more variables: X.proB_FrBC_FL. <dbl>,

我通过使用以下代码在每个基因的末尾添加了一个平均表达式变量(变量的范围是第一个和最后一个样本):

immgen_avg <- immgen_dat %>%
                 rowwise() %>% 
                   mutate(Average = mean(X.proB_CLP_BM.:X.MLP_FL.))

在这里,我有一个简单的问题:我从这段代码中得到的返回的 mean 值没有't match the average I calculated elsewhere (in Excel). I don' t认为有任何缺失值 .

我希望将样本值与平均值进行比较,并计算log2倍差异(样本中基因表达的log2差异与所有样本的平均表达值相比) . 我想存储名为 immgen_log2 的数据帧并进行一些后续分析 . 在这个新的数据框架中,我想将这个与另一个数据表合并,以比较不同实验之间的log2变化 .

这样做的最佳方式是什么?我感谢你的回答 .

2 回答

  • 1

    我将在短时间内解释发生的事情,但解决预期变量的行方法的一种方法是:

    immgen_dat %>%
      mutate(Average = apply(.[, 4:8], 1, mean)) %>%
      select(Average)
    
    #   Average
    # 1   16.46
    # 2  260.60
    # 3  436.20
    # 4  928.00
    # 5  230.00
    # 6   14.82
    

    要查看代码发生了什么,我们可以使用 do 函数,如下所示:

    df2 <- immgen_dat %>%
      rowwise() %>%
      do(Average = .$X.proB_CLP_BM.:.$X.proB_FrBC_BM.) 
    df2$Average[1]
    
    # [[1]]
    # [1] 15.6 16.6 17.6
    

    您将看到 : 以1为步长从15.6生成序列 . 您可以通过键入 help(":") 来更详细地了解此内容 . 所以

    immgen_dat %>%
      rowwise() %>%
      mutate(Average = mean(X.proB_CLP_BM.:X.proB_FrBC_BM.))
    

    您正在计算这些序列的值的均值 .


    编辑

    比率的对数当然是对数的差异(假设分母是非零的) . 所以你试图找到 Average 的log2中每个其他数值变量的log2之间的差异,你可以做类似的事情 .

    immgen_log2 <- immgen_dat
    immgen_log2[,4:9] <- log(immgen_dat[,4:9])
    immgen_log2[,4:8] <- sapply(immgen_log2[,4:8], func)
    
  • 0

    我不完全确定我是否正确地做了你需要做的事情,但是一般情况下使用 dplyrtidyverse (也是 ggplot2 ),你的数据的长表示效果最好 . 我假设您想要为每个 ProbeSetID 计算以 X. 开头的所有变量的平均值 . 然后,对于每个 X. 列和 ProbeSetID ,计算比率并取 log2 ,即 log2(X.bla/mean)

    df <- read.table(text = 'ProbeSetID  X.proB_CLP_BM. X.proB_CLP_FL. X.proB_FrA_BM. X.proB_FrA_FL. X.proB_FrBC_BM.
               10344620        15.6           15.3           17.2           16.1            18.1
               10344622        240.           255.           224.           312.            272. 
               10344624        421.           474.           349.           478.            459. 
               10344633      802.           950.           864.           968.           1056. 
               10344637      199.           262.           167.           267.            255. 
               10344653      14.8           12.8           18.0           13.2            15.3', header = T)
    
    library(dplyr)
    library(tidyr)
    
    result <- 
      df %>% 
      # transform to long:
      gather(key = key, value = value, grep(x = names(.), pattern = "^X\\.")) %>% 
      # group by IDs, ie make rowwise calculations if it was still wide, but faster:
      group_by(ProbeSetID) %>% 
      # calculate group-mean on the fly and calculate log-ratio directly:
      mutate(log2_ratio = log2(value / mean(value)))
    
    # transform back to wide, if needed:
    result %>% 
      # remove initial values to have only 1 value variable:
      select(-value) %>% 
      # go back to wide:
      spread(key = key, value = log2_ratio)
    
    
    # or, if you want to keep all values:
    df %>% 
      # transform to long:
      gather(key = key, value = value, grep(x = names(.), pattern = "^X\\.")) %>% 
      # group by IDs, ie make rowwise calculations if it was still wide, but faster:
      group_by(ProbeSetID) %>% 
      # calculate the mean of each observation:
      mutate(mean_value = mean(value)) %>% 
      # go back to wide:
      spread(key, value) %>% 
      # now do the transformation to each variable that begins with X.:
      mutate_at(.vars = vars(matches("^X\\.")), 
                .funs = funs(log2_ratio = log2(./mean_value)))
    

相关问题