如何在R中将数据帧转换为矩阵
我想将一个命名向量转移到矩阵,并填充缺失的值(用0填充) 例如,我有这样一个数据帧:如何在R中将数据帧转换为矩阵,r,matrix,dataframe,reshape,R,Matrix,Dataframe,Reshape,我想将一个命名向量转移到矩阵,并填充缺失的值(用0填充) 例如,我有这样一个数据帧: col1 col2 col3 Cancer1 Gene1 2.1 Cancer1 Gene2 2.51 Cancer1 Gene3 3.0 Cancer2 Gene1 0.9 它有两列名称:col1和col2。然后我想把它转换成一个矩阵,比如: Cancer1 Cancer2 Gene1 2.1 0.9 Gene2 2.51
col1 col2 col3
Cancer1 Gene1 2.1
Cancer1 Gene2 2.51
Cancer1 Gene3 3.0
Cancer2 Gene1 0.9
它有两列名称:col1
和col2
。然后我想把它转换成一个矩阵,比如:
Cancer1 Cancer2
Gene1 2.1 0.9
Gene2 2.51 0
Gene3 3.0 0
如果向量中缺少值,请用0填充
我怎样才能在R中有效地做到这一点?你可以做一个嵌套的SAPPY,循环遍历每个基因和癌症类型。如果有因子,则使用levels;如果有字符向量,则使用unique()
my.df <- data.frame(col1=c("cancer1", "cancer1", "cancer2", "cancer2"),
col2=c("gene1", "gene2", "gene3", "gene1"),
col3=c(2.1, 2.5, 3.0, 2.2))
my.mat <- sapply(levels(my.df$col1), (function(cancer){
sapply(levels(my.df$col2), (function(gene){
tmp <- my.df[my.df$col1 == cancer & my.df$col2 == gene, "col3"]
if (length(tmp) > 0) {
as.numeric(tmp[1])
} else {
NA
}
}))
}))
my.mat
my.df你可以做一个嵌套的SAPPY,循环遍历每个基因和癌症类型。如果有因子,则使用levels;如果有字符向量,则使用unique()
my.df <- data.frame(col1=c("cancer1", "cancer1", "cancer2", "cancer2"),
col2=c("gene1", "gene2", "gene3", "gene1"),
col3=c(2.1, 2.5, 3.0, 2.2))
my.mat <- sapply(levels(my.df$col1), (function(cancer){
sapply(levels(my.df$col2), (function(gene){
tmp <- my.df[my.df$col1 == cancer & my.df$col2 == gene, "col3"]
if (length(tmp) > 0) {
as.numeric(tmp[1])
} else {
NA
}
}))
}))
my.mat
my.df您可以使用tidyr
软件包:
tidyr::spread(mydata, col1, col3, fill = 0)
# col2 Cancer1 Cancer2
# 1 Gene1 2.10 0.9
# 2 Gene2 2.51 0.0
# 3 Gene3 3.00 0.0
数据:
mydata您可以使用tidyr
软件包:
tidyr::spread(mydata, col1, col3, fill = 0)
# col2 Cancer1 Cancer2
# 1 Gene1 2.10 0.9
# 2 Gene2 2.51 0.0
# 3 Gene3 3.00 0.0
数据:
mydata要么xtabs
要么tapply
应该这样做
tapply(my.df$col3, rev(my.df[-3]), c)
col1
col2 cancer1 cancer2
gene1 2.1 2.2
gene2 2.5 NA
gene3 NA 3.0
tapply
的优点是,如果任何一个组合有多个实例,您可以返回一个函数结果,如应用于组的mean
xtabs(col3 ~ col2 +col1, my.df) #same matrix result
请注意,使用tidyverse
方法,如spread
可能会为您提供一个“特殊”类的数据对象(而不是矩阵),如果您不期望它们,可能会有令人讨厌的属性,或者如果您期望它们可能看起来很好。xtabs
或tapply
都应该这样做
tapply(my.df$col3, rev(my.df[-3]), c)
col1
col2 cancer1 cancer2
gene1 2.1 2.2
gene2 2.5 NA
gene3 NA 3.0
tapply
的优点是,如果任何一个组合有多个实例,您可以返回一个函数结果,如应用于组的mean
xtabs(col3 ~ col2 +col1, my.df) #same matrix result
请注意,使用tidyverse
方法,如spread
可能会为您提供一个“特殊”类的数据对象(而不是矩阵),如果您不期望它们,可能会有令人讨厌的属性,或者如果您期望它们,可能看起来很好。我觉得您想将data.frame转换为矩阵……是的。它是一个data.frame,但只有一列值。其他是名称。tidyr::spread(mydata,col1,col3)
您需要xtabs(col3~col1+clo2,data=your.data.frame.name)
。这将返回一个从matrix类继承方法的表对象。@42-xtabs(col3~col2+col1,data=your.data.frame.name)
正是OP想要的。(行中有基因,列中有癌症)在我看来,你想把data.frame转换成矩阵……是的。它是一个data.frame,但只有一列值。其他是名称。tidyr::spread(mydata,col1,col3)
您需要xtabs(col3~col1+clo2,data=your.data.frame.name)
。这将返回一个从matrix类继承方法的表对象。@42-xtabs(col3~col2+col1,data=your.data.frame.name)
正是OP想要的。(行中的基因和列中的癌症)else{NA
应该是else{0
。比它应该复杂得多。@Masoud:Aboutelse{NA
…你是对的…但前提是你假设基因表达水平缺失,因为它根本不在所选样本中表达…@DamianoFantini“如果载体中缺少值,请用0填充。”OP明确地想要零。我知道请求中说了什么,我告诉过你是对的……我只是建议在处理基因表达数据时要小心这些生物学假设。仅此而已。else{NA
应该是else{0
。比它应该复杂得多。@Masoud:Aboutelse{NA
…你是对的…但前提是你假设基因表达水平缺失,因为它根本不在所选样本中表达…@DamianoFantini“如果载体中缺少值,请用0填充。”OP明确地想要零。我知道请求中说了什么,我告诉过你是对的……我只是建议在处理基因表达数据时要小心这些生物学假设。仅此而已。