首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在R中为孪生数据重塑数据帧

在R中为孪生数据重塑数据帧
EN

Stack Overflow用户
提问于 2021-10-20 08:10:51
回答 2查看 47关注 0票数 1

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

代码语言:javascript
复制
    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 (合并度)值是相同的。

代码语言:javascript
复制
           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

任何帮助都将不胜感激。

EN

回答 2

Stack Overflow用户

发布于 2021-10-20 08:46:32

数据:

代码语言:javascript
复制
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排列,并创建一个变量“孪生”,以区分每对中的两个双胞胎

代码语言:javascript
复制
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

将df拆分为两个数据帧-用于twin1和twin2

代码语言:javascript
复制
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

cbind、合并和重新排列列:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2021-10-20 09:23:08

以下是我们如何仅使用dplyr来实现这一点:

代码语言:javascript
复制
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)

输出:

代码语言:javascript
复制
  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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/69642464

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档