首页 > 解决方案 > dplyr 计算涉及数据框的两列 (R)

问题描述

我对 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 变化。

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

标签: rdplyrcalculated-columns

解决方案


我将在短时间内解释发生了什么,但解决预期变量的行均值的一种方法是:

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

您将看到:从 15.6 开始以 1 为步长生成一个序列。您可以通过键入 来更详细地了解这一点help(":")。所以在

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

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


编辑

比率的对数当然是对数的差(假设分母非零)。因此,您试图从 的 log2 中找到每个其他数值变量的 log2 之间的差异Average,您可以执行类似的操作。

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

推荐阅读