将具有相同 ID 的值分组到列中,而不在 R 中对它们进行求和
Group values with identical ID into columns without summerizing them in R
我有一个看起来像这样的数据框,但有更多的蛋白质
Protein z
Irak4 -2.46
Irak4 -0.13
Itk -0.49
Itk 4.22
Itk -0.51
Ras 1.53
为了进一步操作,我需要将数据按蛋白质名称分组到这样的列中。
Irak4 Itk Ras
-2.46 -0.49 1.53
-0.13 4.22 NA
NA -0.51 NA
我尝试了 dplyr 或 reshape 等不同的包,但未能将数据转换为所需的格式。
有什么办法可以实现吗?我认为某些蛋白质缺少数据点是这里的主要问题。
我是 R 的新手,如果我遗漏了一个明显的解决方案,我深表歉意。
这里有一个选项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<-`
函数在向量后附加 NA
s 以获得长度相等的向量列表。然后我们可以调用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))
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
在 base 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
我有一个看起来像这样的数据框,但有更多的蛋白质
Protein z
Irak4 -2.46
Irak4 -0.13
Itk -0.49
Itk 4.22
Itk -0.51
Ras 1.53
为了进一步操作,我需要将数据按蛋白质名称分组到这样的列中。
Irak4 Itk Ras
-2.46 -0.49 1.53
-0.13 4.22 NA
NA -0.51 NA
我尝试了 dplyr 或 reshape 等不同的包,但未能将数据转换为所需的格式。
有什么办法可以实现吗?我认为某些蛋白质缺少数据点是这里的主要问题。
我是 R 的新手,如果我遗漏了一个明显的解决方案,我深表歉意。
这里有一个选项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<-`
函数在向量后附加 NA
s 以获得长度相等的向量列表。然后我们可以调用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))
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
在 base 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