首页 > 解决方案 > 重组 R 中的多个列

问题描述

这是我的数据示例:

dat<-read.table(text=" id	bx1	Z1A	Z1B	Z1C	QR1	bx2	Z2A	Z2B	Z2C	QR2

1	1	1	2	3	C	18	2	2	1	E
2	11	2	3	3	B	14	3	3	3	A
",header=TRUE)

我想得到下表:

id	bx	Z	QR	Score
1	1	Z1A	C	1
1	1	Z1B	C	2
1	1	Z1C	C	3
1	18	Z2A	E	2
1	18	Z2B	E	2
1	18	Z2C	E	1
2	11	Z1A	B	2
2	11	Z1B	B	3
2	11	Z1C	B	3
2	14	Z2A	A	3
2	14	Z2B	A	3
2	14	Z2C	A	3

假设我有更多的 bxs 和 Zs 并且我已经这样做了,但它不起作用。我想用 tidyverse 或其他包来做。我无法找到解决方案。

df1<-melt(dat, id.var= "id")
谢谢你的帮助

标签: rtidyverse

解决方案


在这种情况下,我们可以使用 a left_joinafter 单独执行pivot_longer

library(dplyr)
library(tidyr)
library(stringr)
dat %>% 
   select(id, starts_with('Z')) %>% 
   pivot_longer(cols = starts_with('Z'), values_to = 'Score', 
         names_to = 'Z') %>%
   group_by(id) %>% 
   mutate(group =  as.character(as.integer(factor(str_remove(Z, "[A-Z]$"))))) %>% 
   left_join(dat %>% 
                  select(id, matches('^[^Z]')) %>% 
                  pivot_longer(cols = -id, names_to = c(".value", "group"),
            names_pattern = "^([A-Za-z]+)([0-9]+)")) %>%
   select(-group)
# A tibble: 12 x 5
# Groups:   id [2]
#      id Z     Score    bx QR   
#   <int> <chr> <int> <int> <fct>
# 1     1 Z1A       1     1 C    
# 2     1 Z1B       2     1 C    
# 3     1 Z1C       3     1 C    
# 4     1 Z2A       2    18 E    
# 5     1 Z2B       2    18 E    
# 6     1 Z2C       1    18 E    
# 7     2 Z1A       2    11 B    
# 8     2 Z1B       3    11 B    
# 9     2 Z1C       3    11 B    
#10     2 Z2A       3    14 A    
#11     2 Z2B       3    14 A    
#12     2 Z2C       3    14 A    

或者另一种选择是先做一个pivot_longer然后fill选择列

dat %>% 
  pivot_longer(cols = -id, names_to = c(".value", "group"),
         names_pattern = "^([A-Za-z]+)([0-9]+[A-Z]?)") %>%
  group_by(id) %>%
  fill(bx, QR) %>%
  ungroup %>% 
  filter(!is.na(Z)) %>% 
  rename_at(vars(Z, group), ~ c('Score', 'Z')) %>%
  mutate(Z = str_c('Z', Z))
# A tibble: 12 x 5
#      id Z        bx Score QR   
#   <int> <chr> <int> <int> <fct>
# 1     1 Z1A       1     1 C    
# 2     1 Z1B       1     2 C    
# 3     1 Z1C       1     3 C    
# 4     1 Z2A      18     2 E    
# 5     1 Z2B      18     2 E    
# 6     1 Z2C      18     1 E    
# 7     2 Z1A      11     2 B    
# 8     2 Z1B      11     3 B    
# 9     2 Z1C      11     3 B    
#10     2 Z2A      14     3 A    
#11     2 Z2B      14     3 A    
#12     2 Z2C      14     3 A    

推荐阅读