首页 > 解决方案 > 尝试从多个数据集创建单个矩阵时如何修复 mutate 错误

问题描述

我正在尝试获取多个数据集(每个数据集 = 1 名患者),其中包括基因和表达数据,并制作一个奇异矩阵,其中基因作为列名,每一行是相应患者的表达数据。问题是有些患者有基因,而其他人没有,所以没有参考。

理想情况下,我想要下面的输出。

Dataset 1                   Dataset 2
Gene     expression         Gene     expression
a        0.3                a        0.1
b        0.1                c        -0.3
e        0.2                d        0.05
f        0.2                f        -0.1


Ideal Output:

     a     b     c     d     e     f
1    0.3   0.1   NA    NA    0.2   0.2
2    0.1   NA    -0.3  0.05  NA    -0.1

另一位用户 (@mikebader) 帮助创建了一个可能的解决方案:

file_names <- list.files(data_dir)

###Making dataframe list
dflist <- list()

for (i in file_names){
  dflist <- append(dflist, read.csv(i, sep="\t"))
}

###Creating merged DF
df <- bind_rows(
  lapply(seq_along(dflist), function(x) mutate(dflist[[x]], dataset = x))
) %>%
  pivot_wider(id_cols = "dataset", names_from = Gene, values_from = expression)

但是,当我尝试执行此操作时,出现以下错误。

 Error in UseMethod("mutate") : 
  no applicable method for 'mutate' applied to an object of class "character" 

我不确定我应该采取的下一步是什么?

标签: rdata-wrangling

解决方案


id您可以将数据框放在列表中,将它们与唯一列绑定在一起,并用于pivot_wider获取宽格式的数据。

library(dplyr)
library(tidyr)

dflist <- list(df1, df2)

bind_rows(dflist, .id = 'id') %>%
  arrange(Gene) %>%
  pivot_wider(names_from = Gene, values_from = expression)

#  id       a     b     c     d     e     f
#  <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#1 1       0.3   0.1  NA   NA      0.2   0.2
#2 2       0.1  NA    -0.3  0.05  NA    -0.1

数据

df1 <- structure(list(Gene = c("a", "b", "e", "f"), expression = c(0.3, 
0.1, 0.2, 0.2)), class = "data.frame", row.names = c(NA, -4L))

df2 <- structure(list(Gene = c("a", "c", "d", "f"), expression = c(0.1, 
-0.3, 0.05, -0.1)), class = "data.frame", row.names = c(NA, -4L))

推荐阅读