在R中为双胞胎数据重塑数据框架



我有一个如下所示的数据框架。每对ID号(如2891、2892)对应一对双胞胎。

ID zyg.x CDsum
1 2891     2     0            
2 2892     2     5            
3 4000     1     0           
4 4001     1     0            
5 4006     2     0
6 4007     2     3

我想重塑这个数据帧,使它看起来像这样…注意zyg。X (zygosity)值对每对双胞胎都是一样的。

Twin Pair     zyg   CDsumTwin1   CDsumTwin2
1   pair1(2891,2892)       2            0            5
2   pair2(4000,4001)       1            0            0
3   pair3(4006,4007)       2            0            3

任何帮助都将非常感激。

数据:

df <- read.table(text = "    ID zyg.x CDsum
1 2891     2     0            
2 2892     2     5            
3 4000     1     0           
4 4001     1     0            
5 4006     2     0
6 4007     2     3")

按ID排序并创建一个变量"twin"区分每对双胞胎中的两个

df<- df %>%
arrange(ID) %>%
mutate(twin = rep(c(1, 2),length.out = n()))
df
ID zyg.x CDsum twin
1 2891     2     0    1
2 2892     2     5    2
3 4000     1     0    1
4 4001     1     0    2
5 4006     2     0    1
6 4007     2     3    2

为twin1和twin2拆分df为两个数据帧

twin1 <- df %>%
filter(twin == 1) %>%
select(-twin) %>%
rename(CDsumTwin1 = CDsum, 
ID1 = ID)
twin1
ID1 zyg.x CDsumTwin1
1 2891     2          0
3 4000     1          0
5 4006     2          0
twin2 <- df %>%
filter(twin == 2) %>%
select(-twin) %>%
rename(CDsumTwin2 = CDsum,
ID2 = ID)
twin2
ID2 zyg.x CDsumTwin2
2 2892     2          5
4 4001     1          0
6 4007     2          3

合并和重新排列列:

twin1 %>% cbind(twin2 %>% select(-zyg.x)) %>%
mutate(`Twin Pair` = paste0("pair (", ID1, ", ", ID2, ")")) %>%
select(`Twin Pair`, zyg.x, CDsumTwin1, CDsumTwin2)

Twin Pair zyg.x CDsumTwin1 CDsumTwin2
1 pair (2891, 2892)     2          0          5
3 pair (4000, 4001)     1          0          0
5 pair (4006, 4007)     2          0          3

以下是我们如何仅通过dplyr实现这一点:

library(dplyr)
df %>% 
mutate(rn = ceiling(row_number()/2)) %>% 
group_by(rn) %>% 
mutate(Twin_Pair = paste0(ID, collapse = ","),
Twin_Pair = paste0("pair",rn, "(",Twin_Pair, ")")) %>% 
mutate(CDsumTwin1 = first(CDsum),
CDsumTwin2 = last(CDsum), .keep="unused") %>%  
slice(2) %>% 
ungroup() %>% 
select(Twin_Pair, zyg=zyg.x, CDsumTwin1, CDsumTwin2)

输出:

Twin_Pair          zyg CDsumTwin1 CDsumTwin2
<chr>            <dbl>      <dbl>      <dbl>
1 pair1(2891,2892)     2          0          5
2 pair2(4000,4001)     1          0          0
3 pair3(4006,4007)     2          0          3

最新更新