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

时间:2018-04-27 02:27:15

标签: r dplyr calculated-columns

我对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值与我在别处(Excel中)计算的平均值不匹配。我不认为有任何遗漏的价值。

我想做的是以下内容:对于每个基因,我想将样本值与平均值进行比较,并计算log2倍差异(基因表达的log2差异)样本与所有样本的平均表达值进行比较)。我希望将此数据框存储为immgen_log2,然后进行一些后续分析。在这个新的数据框架中,我想保留基因名称,因为我想将其与另一个数据表合并,以比较不同实验之间的log2变化。

这样做的最佳方式是什么?我很感激你的回答。

2 个答案:

答案 0 :(得分: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)

答案 1 :(得分:0)

我不完全确定我是否正确地做了你需要做的事情,但是一般情况下使用dplyrtidyverse(也是ggplot2),您的数据效果最佳。我假设您要为每个X.计算以ProbeSetID开头的所有变量的平均值。然后,对于每个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)))