【问题标题】:Group values with identical ID into columns without summerizing them in R将具有相同 ID 的值分组到列中,而不在 R 中对它们进行汇总
【发布时间】:2018-09-18 21:11:46
【问题描述】:

我有一个看起来像这样的数据框,但包含更多的蛋白质

Protein      z
  Irak4  -2.46
  Irak4  -0.13
    Itk  -0.49
    Itk   4.22
    Itk  -0.51
    Ras   1.53

对于进一步的操作,我需要将数据按 Proteinname 分组到这样的列中。

Irak4    Itk    Ras
-2.46  -0.49   1.53
-0.13   4.22     NA
   NA  -0.51     NA

我尝试了不同的软件包,如 dplyr 或 reshape,但未能将数据转换为所需的格式。

有什么方法可以实现吗?我认为某些蛋白质的缺失数据点是这里的主要问题。

我对 R 很陌生,所以如果我错过了一个明显的解决方案,我深表歉意。

【问题讨论】:

  • 在 base r 中使用 reshape 可以做到这一点。即reshape(transform(df,gr=ave(z,Protein,FUN=seq_along)),v.names = 'z',timevar = 'Protein',idvar = 'gr',dir='wide')
  • 你可以使用library(data.table);dcast(setDT(df),rowid(Protein)~Protein,value.var='z')

标签: r dataframe reshape missing-data


【解决方案1】:

这是tidyverse的选项

library(tidyverse)
DF %>% 
  group_by(Protein) %>% 
  mutate(idx = row_number()) %>% 
  spread(Protein, z) %>% 
  select(-idx)
# A tibble: 3 x 3
#   Irak4   Itk   Ras
#   <dbl> <dbl> <dbl>
#1  -2.46 -0.49  1.53
#2  -0.13  4.22 NA   
#3  NA    -0.51 NA 

在spread 数据之前,我们需要创建唯一标识符。


在base R 中,您可以首先使用unstack,这将为您提供一个包含z 列中值的向量的命名列表。

使用lapply 遍历该列表,并使用`length&lt;-` 函数将NAs 附加到向量中,以获得长度相等的向量列表。然后我们可以拨打data.frame。

lst <- unstack(DF, z ~ Protein)
data.frame(lapply(lst, `length<-`, max(lengths(lst))))
#  Irak4   Itk  Ras
#1 -2.46 -0.49 1.53
#2 -0.13  4.22   NA
#3    NA -0.51   NA

数据

DF <- structure(list(Protein = c("Irak4", "Irak4", "Itk", "Itk", "Itk", 
"Ras"), z = c(-2.46, -0.13, -0.49, 4.22, -0.51, 1.53)), .Names = c("Protein", 
"z"), class = "data.frame", row.names = c(NA, -6L))

【讨论】:

    【解决方案2】:
    library(data.table)
    
    dcast(setDT(df),rowid(Protein)~Protein,value.var='z')
    
       Protein Irak4   Itk  Ras
    1:       1 -2.46 -0.49 1.53
    2:       2 -0.13  4.22   NA
    3:       3    NA -0.51   NA
    

    在基础 R 中你可以这样做:

    data.frame(sapply(a<-unstack(df,z~Protein),`length<-`,max(lengths(a))))
      Irak4   Itk  Ras
    1 -2.46 -0.49 1.53
    2 -0.13  4.22   NA
    3    NA -0.51   NA
    

    或者使用重塑:

    reshape(transform(df,gr=ave(z,Protein,FUN=seq_along)),v.names = 'z',timevar = 'Protein',idvar = 'gr',dir='wide') 
      gr z.Irak4 z.Itk z.Ras
    1  1   -2.46 -0.49  1.53
    2  2   -0.13  4.22    NA
    5  3      NA -0.51    NA
    

    【讨论】:

      猜你喜欢
      • 2018-08-03
      • 1970-01-01
      • 2021-04-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-05
      相关资源
      最近更新 更多