Сгруппируйте значения с одинаковым идентификатором в столбцы, не суммируя их в R - PullRequest
0 голосов
/ 19 сентября 2018

У меня есть датафрейм, который выглядит примерно так, но с гораздо большим количеством белков

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, поэтому я приношу свои извинения, если я упускаю очевидное решение.

Ответы [ 2 ]

0 голосов
/ 19 сентября 2018
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
0 голосов
/ 19 сентября 2018

Вот вариант с 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 для перебора этого списка и добавьте векторы с NA s, используя функцию `length<-`, чтобы получить список векторов одинаковой длины.Тогда мы можем позвонить 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

data

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))
...