我有一个如下所示的数据框架。每对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