在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