R 在不同的行中重新构造具有多个相同ID的数据集

R 在不同的行中重新构造具有多个相同ID的数据集,r,bioinformatics,R,Bioinformatics,我有一个数据集,ID列在第1列,诊断列在第2列,原因列在第3列,依此类推。对于具有多个诊断的ID,每个诊断列为一行,因此具有多个诊断的同一ID具有多行。我希望所有内容都是每个ID一行,几个诊断都是列。这可能吗 我的数据如下所示: ID diagnosis cause_of_diagnosis 1 A A 1 B B 1 C C 2 A A 3 A A 3 B B 3 C C 我希望数据最终看起来像: ID diagnosis_1 diagnosis_2

我有一个数据集,ID列在第1列,诊断列在第2列,原因列在第3列,依此类推。对于具有多个诊断的ID,每个诊断列为一行,因此具有多个诊断的同一ID具有多行。我希望所有内容都是每个ID一行,几个诊断都是列。这可能吗

我的数据如下所示:

ID diagnosis cause_of_diagnosis
1   A  A
1   B  B
1   C  C
2   A  A
3   A  A
3   B  B
3   C  C
我希望数据最终看起来像:

ID diagnosis_1 diagnosis_2 diagnosis_3 cause_of_diagnosis_1 cause_of_diagnosis_2 cause_of_diagnosis_3
 1  A  B  C  A  B  C
 2  A  -  -  A  -  -
 3  A  B  C  A  B  C

我们可以使用
dplyr
tidyr
来重塑数据。使用
collect
以长格式获取数据,
group\u by
ID
key
为每个“诊断”和“诊断原因”创建新列名,并
以宽格式传播数据

library(dplyr)
library(tidyr)

df %>%
  gather(key, value, -ID) %>%
  group_by(ID, key) %>%
  mutate(key1 = paste(key, row_number(), sep = "_")) %>%
  ungroup() %>%
  select(-key) %>%
  spread(key1, value)

#     ID cause_of_diagnosis_1 cause_of_diagnosis_2 cause_of_diagnosis_3 diagnosis_1 diagnosis_2 diagnosis_3
#  <int> <chr>                <chr>                <chr>                <chr>       <chr>       <chr>      
#1     1 A                    B                    C                    A           B           C          
#2     2 A                    NA                   NA                   A           NA          NA         
#3     3 A                    B                    C                    A           B           C  
库(dplyr)
图书馆(tidyr)
df%>%
聚集(键,值,-ID)%%>%
分组依据(ID,键)%>%
突变(键1=粘贴(键,行号(),sep=“”))%>%
解组()%>%
选择(-key)%%>%
排列(键1,值)
#ID原因诊断原因诊断原因诊断原因2原因诊断原因诊断原因3诊断原因1诊断原因2诊断原因3
#                                                                       
#1 1 A B C A B C
#2不,不,不,不
#3 3 A B C A B C
数据

df <- structure(list(ID = c(1L, 1L, 1L, 2L, 3L, 3L, 3L),diagnosis = structure(c(1L, 
2L, 3L, 1L, 1L, 2L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
cause_of_diagnosis = structure(c(1L, 2L, 3L, 1L, 1L, 2L, 
3L), .Label = c("A", "B", "C"), class = "factor")), 
class = "data.frame", row.names = c(NA, -7L))

df我们可以使用
dplyr
tidyr
来重塑数据。使用
collect
以长格式获取数据,
group\u by
ID
key
为每个“诊断”和“诊断原因”创建新列名,并
以宽格式传播数据

library(dplyr)
library(tidyr)

df %>%
  gather(key, value, -ID) %>%
  group_by(ID, key) %>%
  mutate(key1 = paste(key, row_number(), sep = "_")) %>%
  ungroup() %>%
  select(-key) %>%
  spread(key1, value)

#     ID cause_of_diagnosis_1 cause_of_diagnosis_2 cause_of_diagnosis_3 diagnosis_1 diagnosis_2 diagnosis_3
#  <int> <chr>                <chr>                <chr>                <chr>       <chr>       <chr>      
#1     1 A                    B                    C                    A           B           C          
#2     2 A                    NA                   NA                   A           NA          NA         
#3     3 A                    B                    C                    A           B           C  
库(dplyr)
图书馆(tidyr)
df%>%
聚集(键,值,-ID)%%>%
分组依据(ID,键)%>%
突变(键1=粘贴(键,行号(),sep=“”))%>%
解组()%>%
选择(-key)%%>%
排列(键1,值)
#ID原因诊断原因诊断原因诊断原因2原因诊断原因诊断原因3诊断原因1诊断原因2诊断原因3
#                                                                       
#1 1 A B C A B C
#2不,不,不,不
#3 3 A B C A B C
数据

df <- structure(list(ID = c(1L, 1L, 1L, 2L, 3L, 3L, 3L),diagnosis = structure(c(1L, 
2L, 3L, 1L, 1L, 2L, 3L), .Label = c("A", "B", "C"), class = "factor"), 
cause_of_diagnosis = structure(c(1L, 2L, 3L, 1L, 1L, 2L, 
3L), .Label = c("A", "B", "C"), class = "factor")), 
class = "data.frame", row.names = c(NA, -7L))

df好的,谢谢!您是为key、key1和value输入任何值,还是按原样运行?@Gunn HelenMoen
key
key1
是动态生成的。按原样运行。好的-我不确定这是否正是我想要的。我目前没有得到任何诊断专栏,但有大约700种不同的诊断原因columns@Gunn-HelenMoen你确定数据中没有诊断栏吗?“诊断”列将位于末尾,因为这些列是按字母顺序排序的。将上述结果存储在
df1
中,然后运行
grep(“^diagnosis”,names(df1))
您得到了什么?是的,也有诊断列,但看起来有几百列-我不太清楚为什么会这样,谢谢!您是为key、key1和value输入任何值,还是按原样运行?@Gunn HelenMoen
key
key1
是动态生成的。按原样运行。好的-我不确定这是否正是我想要的。我目前没有得到任何诊断专栏,但有大约700种不同的诊断原因columns@Gunn-HelenMoen你确定数据中没有诊断栏吗?“诊断”列将位于末尾,因为这些列是按字母顺序排序的。将上述结果存储在
df1
中,然后运行
grep(“^diagnosis”,names(df1))
您得到了什么?是的,也有诊断列,但看起来有几百个,我不太清楚这是为什么