在R或python中重塑表
我有一张这样的桌子:在R或python中重塑表,r,R,我有一张这样的桌子: 在R中复制此数据帧的代码: ID=c(“0”、“51”、“7”、“62”、“1”、“10”、“5”、“79”、“62”、“10”、“1”、“7”) mRNA=c(“0”、“0”、“30”、“1”、“0”、“14”、“0”、“1”、“1”、“16”、“0”、“0”) 质心=c(“d0”、“d0”、“d0”、“d0”、“d1”、“d1”、“d1”、“d1”、“d1”、“d10”、“d10”、“d10”) df我们可以为每个质心创建一个唯一的ID列,然后以宽格式重塑数据 lib
在R中复制此数据帧的代码:
ID=c(“0”、“51”、“7”、“62”、“1”、“10”、“5”、“79”、“62”、“10”、“1”、“7”)
mRNA=c(“0”、“0”、“30”、“1”、“0”、“14”、“0”、“1”、“1”、“16”、“0”、“0”)
质心=c(“d0”、“d0”、“d0”、“d0”、“d1”、“d1”、“d1”、“d1”、“d1”、“d10”、“d10”、“d10”)
df我们可以为每个质心创建一个唯一的ID
列,然后以宽格式重塑数据
library(dplyr)
df %>%
group_by(Centroid) %>%
mutate(ID = paste0("mRNA_", row_number())) %>%
tidyr::pivot_wider(names_from = ID, values_from = mRNA)
# Centroid mRNA_1 mRNA_2 mRNA_3 mRNA_4 mRNA_5
# <fct> <fct> <fct> <fct> <fct> <fct>
#1 d0 0 0 30 1 NA
#2 d1 0 14 0 1 1
#3 d10 16 0 0 NA NA
库(dplyr)
df%>%
分组依据(质心)%>%
突变(ID=paste0(“mRNA”,行数())%>%
tidyr::pivot\u更宽(名称\u from=ID,值\u from=mRNA)
#质心mRNA_1 mRNA_2 mRNA_3 mRNA_4 mRNA_5
#
#1 D00 0 30 1 NA
#2 d1 0 14 0 1 1
#3 d10 16 0 NA
如果您在Python中需要它,这是一个使用pandas的解决方案,它的数据结构与R(数据帧)类似
# setup
import pandas as pd
ID = [0, 51, 7, 62, 1, 10, 5, 79, 62, 10, 1, 7]
mRNA = [0, 0, 30, 1, 0, 14, 0, 1, 1, 16, 0, 0]
Centroid = ['d0', 'd0', 'd0', 'd0', 'd1', 'd1', 'd1', 'd1', 'd1', 'd10', 'd10', 'd10']
df = pd.DataFrame([ID,mRNA,Centroid])
df = df.transpose()
df.rename(columns={0:'ID',1:'mRNA',2:'Centroid'},inplace=True)
# transformation
df['mRNA_idx'] = 'mRNA_' + (df.groupby(['Centroid']).cumcount() + 1).astype(str)
df.pivot(index='Centroid',columns='mRNA_idx',values='mRNA')
# result
>>> df
mRNA_idx mRNA_1 mRNA_2 mRNA_3 mRNA_4 mRNA_5
Centroid
d0 0 0 30 1 NaN
d1 0 14 0 1 1
d10 16 0 0 NaN NaN
是不是每个质心正好有4个ID值?不一定,它们可以有多于或少于4个。@Amaranta_Remedios我不知道你所说的是什么意思,但不符合顺序。
但据我所知,它给出的预期输出与你的帖子中所示的相同。没关系,我得到了一个与混淆,问题是在我以前的代码。很抱歉,您的代码工作得很好。它可以工作,但问题是它只能水平扩展。如果您为它提供更多的Centroid
数据,它也会垂直扩展。
library(dplyr)
df %>%
group_by(Centroid) %>%
mutate(ID = paste0("mRNA_", row_number())) %>%
tidyr::pivot_wider(names_from = ID, values_from = mRNA)
# Centroid mRNA_1 mRNA_2 mRNA_3 mRNA_4 mRNA_5
# <fct> <fct> <fct> <fct> <fct> <fct>
#1 d0 0 0 30 1 NA
#2 d1 0 14 0 1 1
#3 d10 16 0 0 NA NA
# setup
import pandas as pd
ID = [0, 51, 7, 62, 1, 10, 5, 79, 62, 10, 1, 7]
mRNA = [0, 0, 30, 1, 0, 14, 0, 1, 1, 16, 0, 0]
Centroid = ['d0', 'd0', 'd0', 'd0', 'd1', 'd1', 'd1', 'd1', 'd1', 'd10', 'd10', 'd10']
df = pd.DataFrame([ID,mRNA,Centroid])
df = df.transpose()
df.rename(columns={0:'ID',1:'mRNA',2:'Centroid'},inplace=True)
# transformation
df['mRNA_idx'] = 'mRNA_' + (df.groupby(['Centroid']).cumcount() + 1).astype(str)
df.pivot(index='Centroid',columns='mRNA_idx',values='mRNA')
# result
>>> df
mRNA_idx mRNA_1 mRNA_2 mRNA_3 mRNA_4 mRNA_5
Centroid
d0 0 0 30 1 NaN
d1 0 14 0 1 1
d10 16 0 0 NaN NaN