通过切片行名-R将2列数据帧转换为矩阵
我在R中有两个数据帧,我想把它们转换成一个矩阵。下面是我的示例数据 data.frame通过切片行名-R将2列数据帧转换为矩阵,r,unix,matrix,R,Unix,Matrix,我在R中有两个数据帧,我想把它们转换成一个矩阵。下面是我的示例数据 data.framedat包含两列,一列包含名称,第二列包含一些分数 > head(dat, n=20) V1 V2 1 4star_Active_TSS 10.99561503 2
dat
包含两列,一列包含名称,第二列包含一些分数
> head(dat, n=20)
V1 V2
1 4star_Active_TSS 10.99561503
2 4star_Bivalent_Enhancer 0.42425920
3 4star_Bivalent_Poised_TSS 0.31163730
4 4star_Enhancers 139.64713405
5 4star_Flanking_Active_TSS 23.11961717
6 4star_Flanking_Bivalent_TSS_Enh 0.17654506
7 4star_Genic_enhancers 44.42394542
8 4star_Heterochromatin -34.61099049
9 4star_Quiescent_Low -28.54240987
10 4star_Repressed_PolyComb -0.42096698
11 4star_Strong_transcription 12.70895605
12 4star_Transcr_at_gene_5_and_3 0.00000000
13 4star_Weak_Repressed_PolyComb 0.08902141
14 4star_Weak_transcription 19.28859369
15 4star_ZNF_genes_and_repeats -1.58340662
16 A549_EtOH_0.02pct_Lung_Carcinoma_Active_TSS 14.01552989
17 A549_EtOH_0.02pct_Lung_Carcinoma_Bivalent_Enhancer 1.00466761
18 A549_EtOH_0.02pct_Lung_Carcinoma_Bivalent_Poised_TSS 1.20607773
19 A549_EtOH_0.02pct_Lung_Carcinoma_Enhancers 63.36004048
20 A549_EtOH_0.02pct_Lung_Carcinoma_Flanking_Active_TSS 48.27400816
另一个数据框有一列,包含行的一半名称。上述数据框的名称
> states=read.delim("states.txt", header=FALSE)
> states
V1
1 Active_TSS
2 Bivalent_Enhancer
3 Bivalent_Poised_TSS
4 Enhancers
5 Flanking_Active_TSS
6 Flanking_Bivalent_TSS_Enh
7 Genic_enhancers
8 Heterochromatin
9 Quiescent_Low
10 Repressed_PolyComb
11 Strong_transcription
12 Transcr_at_gene_5_and_3
13 Weak_Repressed_PolyComb
14 Weak_transcription
15 ZNF_genes_and_repeats
我希望生成的矩阵/data.frame如下所示。我想把第一个data.frame的第一列和第二个data.frame的列切掉,然后创建一个如下所示的矩阵
>dd_matrix
Active_TSS Bivalent_Enhancer
4star 10.99562 0.4242592
A549_EtOH_0.02pct_Lung_Carcinoma 14.01553 1.0046676
Bivalent_Poised_TSS Enhancers
4star 0.3116373 139.64713
A549_EtOH_0.02pct_Lung_Carcinoma 1.2060777 63.36004
Flanking_Active_TSS Flanking_Bivalent_TSS_Enh
4star 23.11962 0.1765451
A549_EtOH_0.02pct_Lung_Carcinoma 48.27401 1.1449923
Genic_enhancers Heterochromatin Quiescent_Low
4star 44.423945 -34.610990 -28.54241
A549_EtOH_0.02pct_Lung_Carcinoma 5.976754 -1.274768 -31.68228
Repressed_PolyComb Strong_transcription
4star -0.420967 12.708956
A549_EtOH_0.02pct_Lung_Carcinoma -0.331186 3.375022
Transcr_at_gene_5_and_3
4star 0.000000
A549_EtOH_0.02pct_Lung_Carcinoma 1.501412
Weak_Repressed_PolyComb Weak_transcription
4star 0.08902141 19.28859
A549_EtOH_0.02pct_Lung_Carcinoma -0.05151471 11.19855
ZNF_genes_and_repeats
4star -1.583407
A549_EtOH_0.02pct_Lung_Carcinoma 0.000000
任何帮助都将不胜感激。任何R
或unix
解决方案都可以工作
谢谢。这里有一个使用dplyr
/tidyr
的解决方案:
require(tidyverse);
df %>%
separate(V1, into = c("what","states"), "_", extra = "merge") %>%
spread(states, V2) %>%
column_to_rownames("what");
# Active_TSS Bivalent_Enhancer Bivalent_Poised_TSS Enhancers
#4star 10.99562 0.4242592 0.3116373 139.6471
#A549 NA NA NA NA
# EtOH_0.02pct_Lung_Carcinoma_Active_TSS
#4star NA
#A549 14.01553
# EtOH_0.02pct_Lung_Carcinoma_Bivalent_Enhancer
#4star NA
#A549 1.004668
# EtOH_0.02pct_Lung_Carcinoma_Bivalent_Poised_TSS
#4star NA
#A549 1.206078
# EtOH_0.02pct_Lung_Carcinoma_Enhancers
#4star NA
#A549 63.36004
# EtOH_0.02pct_Lung_Carcinoma_Flanking_Active_TSS Flanking_Active_TSS
#4star NA 23.11962
#A549 48.27401 NA
# Flanking_Bivalent_TSS_Enh Genic_enhancers Heterochromatin Quiescent_Low
#4star 0.1765451 44.42395 -34.61099 -28.54241
#A549 NA NA NA NA
# Repressed_PolyComb Strong_transcription Transcr_at_gene_5_and_3
#4star -0.420967 12.70896 0
#A549 NA NA NA
# Weak_Repressed_PolyComb Weak_transcription ZNF_genes_and_repeats
#4star 0.08902141 19.28859 -1.583407
#A549 NA NA NA
说明:通过在第一个“quot
上拆分,将V1
分为两列;然后将states
用作键,将V2
用作值,将what
列转换为行名称,将扩展为宽格式
样本数据
df棘手的事情似乎是,状态和前缀之间没有分隔符,一些状态是其他状态的一部分。不管怎样,这就是我想到的:
library(tidyverse)
dat %>%
rowwise() %>%
mutate(postfix = max(states$V1[str_detect(V1, states$V1)])) %>%
mutate(prefix = str_replace(V1, str_c("_", postfix), "")) %>%
melt(id.vars = c("postfix", "prefix"), measure.vars = "V2") %>%
dcast(prefix ~ postfix)
在第一个mutate
中,识别最长的匹配状态以形成后缀。在第二个mutate
中,删除该后缀
以形成前缀 你好,毛里塔尼亚,非常感谢。我稍微修改了输入df
。是否有一种方法可以根据上次出现的\uu
拆分V1
?我检查了separate
函数,但我在理解上没有什么问题。更新:我编写了一个shell脚本,只保留了一个。
。现在它工作得很好。非常感谢。@cat只是想澄清一下:在我的解决方案中,separate
拆分上的术语,将第一个术语存储在what
列中,并将剩余的合并术语存储在states
列中。如果什么
总是以第一个下划线与状态
分开,则此解决方案将有效。@cat PS。您可以通过在解决方案旁边设置勾号来关闭问题并接受最能回答您问题的解决方案。我已相应地进行了修改。现在我可以根据需要得到输出。谢谢
library(tidyverse)
dat %>%
rowwise() %>%
mutate(postfix = max(states$V1[str_detect(V1, states$V1)])) %>%
mutate(prefix = str_replace(V1, str_c("_", postfix), "")) %>%
melt(id.vars = c("postfix", "prefix"), measure.vars = "V2") %>%
dcast(prefix ~ postfix)