我试图采取包括基因和表达数据的多个数据集(每个数据集= 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"
我不知道下一步该做什么?
您可以将数据框放在一个列表中,将它们与唯一的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))
我找到了问题所在。这是因为我没有正确地制作数据框列表。相反,我使用了下面的代码,然后代码就工作了。
dflist <- lapply(file_names, read.csv, sep="t")